【问题标题】:filtar table dropdown livewire with Laravel使用 Laravel 过滤表下拉 livewire
【发布时间】:2020-11-10 20:34:49
【问题描述】:

我有这个 livewire 组件,它根据两个下拉按钮过滤表格。一个称为实例,另一个称为作业。我想找到一种过滤两个按钮的方法。

以这种方式或我将其传递给渲染 updatejob 或 updateinstance。所以只有两个按钮中的一个起作用。有什么方法可以让它们都工作吗?

从某种意义上说,如果我使用一个公共变量,通过这两种方法将查询结果传递给它,它不允许我进行分页,因为我将操作它的公共变量,它允许集合

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]);
        }
    }

【问题讨论】:

    标签: laravel filter dropdown laravel-livewire


    【解决方案1】:

    您可以使用when() 有条件地应用两个 where 子句。这里的第一个参数暴露在闭包中,这对于传递模型的这种特殊情况很有用。如果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]);
        }
    }
    

    【讨论】:

    • 我还用一个名为 tasks 的公共变量解决了这个问题,不幸的是,公共变量不支持 paginate 方法作为集合 @Qirel 错误:Livewire 组件的 [table-todo] 公共属性 [tasks] 必须是类型: [数字、字符串、数组、空值或布尔值]。只有受保护或私有属性可以设置为其他类型,因为 JavaScript 不需要访问它们。
    • 公平点,但想法是一样的。您可以改为通过render() 方法传递它(通过将其作为第二个参数传递给view())。
    • 对不起,但我不明白如何在实践中做到这一点@Qirel
    • 我更新了答案以表明这一点。应该像现在的答案一样工作。
    猜你喜欢
    • 2015-04-02
    • 2021-08-18
    • 1970-01-01
    • 2019-05-20
    • 2011-10-26
    • 2023-02-07
    • 2021-05-25
    • 1970-01-01
    相关资源
    最近更新 更多