выпадающая таблица filtar livewire с Laravel

У меня есть компонент livewire, который фильтрует таблицу на основе двух раскрывающихся кнопок. один называется «Экземпляр», а другой - «Работа». Я хотел бы найти способ отфильтровать обе кнопки.

таким образом, или я передаю его для рендеринга задания обновления или экземпляра обновления. Таким образом, работает только одна из двух кнопок. есть ли способ заставить их обоих работать?

в том смысле, что если я использую общедоступную переменную, в которую я передаю результаты запроса через два метода, это не позволяет мне выполнять разбиение на страницы, поскольку я буду управлять ее общедоступной переменной, которая позволяет коллекции

namespace App\Http\Livewire;
    use Livewire\WithPagination;
    
    use App\Models\Task;
    use Livewire\Component;
    
    class TableTodo extends Component
    {
        use WithPagination;
    
        public $instance;
        public $job;
        public $jobs;
        // public $tasks;
        public $instances;
    
        public function updatinginstance()
        {
            $this->resetPage();
        }
    
        public function mount()
        {
            $this->instance='';
            $this->job='';
            // $this->tasks=[];
            $this->instances=[];
            $this->jobs=[];
        }
    
        public function updatedinstance()
        {
            $in = Task::find($this->instance);
    
            if(!empty($in))
            {
                $tasks= Task::whereIn('process_status', ['new','processing'])
                ->where('instance','like', $in->instance)
                ->orderByRaw('FIELD(process_status, "new", "processing")asc')
                ->orderBy('created_at', 'asc')
                ->paginate(50)
                ;
            }
            else
            {
                $tasks= Task::whereIn('process_status', ['new','processing'])
                ->orderByRaw('FIELD(process_status, "new", "processing")asc')
                ->orderBy('created_at', 'asc')
                ->paginate(50)
                ;
            }
    
            return $tasks;
    
        }
    
        public function updatedjob()
        {
    
            $in_job = Task::find($this->job);
    
            if(!empty($in_job))
            {
                $tasks = Task::whereIn('process_status', ['new','processing'])
                ->where('job', 'like', $in_job->job)
                ->orderByRaw('FIELD(process_status, "new", "processing")asc')
                ->orderBy('created_at', 'asc')
                ->paginate(50);
            }
            else
            {
                $tasks = Task::whereIn('process_status', ['new','processing'])
                ->orderByRaw('FIELD(process_status, "new", "processing")asc')
                ->orderBy('created_at', 'asc')
                ->paginate(50);
            }
    
            return $tasks;
        }
    
    
        public function render()
        {
            $this->instances = Task::whereIn('process_status', ['new','processing'])->orderBy('created_at', 'asc')->get();
    
            $this->jobs = Task::whereIn('process_status', ['new','processing'])->orderBy('created_at', 'asc')->get();
            $tasks = $this->updatedjob();
            $tasks = $this->updatedinstance();
    
            return view('livewire.table-todo',['tasks' => $tasks]);
        }
    }

person bigeyes    schedule 10.11.2020    source источник


Ответы (1)


Вы можете условно применить оба предложения where, используя when(). Первый аргумент здесь представлен в замыкании, что полезно в этом конкретном случае, когда вы передаете модель. Если первый параметр when() истинен, он выполняет закрытие. В противном случае ничего не происходит.

Вы также можете сильно очистить код, повторно используя одни и те же методы, вместо того, чтобы повторяться.

<?php 

namespace App\Http\Livewire;

use Livewire\WithPagination;

use App\Models\Task;
use Livewire\Component;

class TableTodo extends Component
{
    use WithPagination;

    public $instance = '';
    public $job = '';
    public $jobs = [];
    public $instances = [];

    private $tasks = [];

    public function updatinginstance()
    {
        $this->resetPage();
    }

    public function mount()
    {
        $this->instances = Task::whereIn('process_status', ['new', 'processing'])
                               ->orderBy('created_at', 'ASC')
                               ->get();
        $this->jobs = Task::whereIn('process_status', ['new', 'processing'])
                          ->orderBy('created_at', 'ASC')
                          ->get();
        $this->filterTask();
    }

    public function updatedInstance()
    {
        $this->filterTask();
    }

    public function updatedJob()
    {
        $this->filterTask();
    }

    public function filterTask() 
    {
        $job = Task::find($this->job);
        $instance = Task::find($this->instance);

        $tasks = Task::when($job, function($query, $job) {
                    return $query->where('job', 'LIKE', $job->job);
                })
                ->when($instance, function($query, $instance) {
                    return $query->where('instance','like', $instance->instance);
                })
                ->orderByRaw("FIELD(process_status, 'new', 'processing') ASC")
                ->orderBy('created_at', 'asc')
                ->paginate(50);

        $this->tasks = $tasks;
    }

    public function render()
    {
        return view('livewire.table-todo', ['tasks' => $this->tasks]);
    }
}
person Qirel    schedule 10.11.2020
comment
Я также решил это с помощью общедоступной переменной с именем tasks, к сожалению, общедоступные переменные не поддерживают метод paginate, поскольку коллекции @Qirel Ошибка: общедоступное свойство [задачи] компонента Livewire [table-todo] должно иметь тип: [numeric, string, array, null или логическое]. Только защищенные или частные свойства могут быть установлены как другие типы, потому что JavaScript не нуждается в доступе к ним. - person bigeyes; 11.11.2020
comment
Справедливо, но идея та же. Вместо этого вы можете передать его через метод render() (передав его в качестве второго параметра в view()). - person Qirel; 11.11.2020
comment
извините, но я не понял, как это сделать на практике @Qirel - person bigeyes; 11.11.2020
comment
Я обновил ответ, чтобы показать это. Должен сработать ответ сейчас. - person Qirel; 11.11.2020