使用 laravel 和 livewire 将过滤器添加到 table

add filter to table using laravel and livewire

我正在尝试使用 laravel 和 livewire 创建过滤器。我的过滤器将有一个包含以下项目的 select 框:

我希望当用户 select 从 select 框中激活时,我希望显示激活的项目。 我写了这样的代码,但它不起作用!有什么问题?

public $filter_buy_status = '';

public function render()
{
    if ($this->loadData == true) {
        $coins = Coin::where('name', 'like', '%'.$this->search.'%')
            ->orWhere('symbol', 'like', '%'.$this->search.'%')
            ->where('buy_status' , $this->filter_buy_status)
            ->get();
    } else {
        $coins = [];
    }
    return view('livewire.backend.crypto.coins')->with('coins' , collect($coins)->paginate($this->perPage));
}

由于您还没有显示 select-元素,我们假设它看起来像这样,其中“显示全部”是一个空值。

<select wire:model="filter_buy_status">
    <option value="">Show All</option>
    <option value="active">Show Active</option>
    <option value="inactive">Show Inactive</option>
</select>

然后,因为空字符串是一个“假”值(意味着如果你 if ("") 它将是假的),我们可以使用 when() 应用条件。这是一个 Laravel 过滤方法,仅在 when() 中的条件为真时应用。

对您的 WHERE 条件进行分组也很重要。如果您希望将状态过滤器应用于所有对象,然后搜索“where symbol OR where name”,那么您的 SQL 将如下所示

WHERE buy_status = 'Active' AND (name LIKE '%search%' OR symbol LIKE '%search%')

在 Laravel 中,这意味着您将所有 orWhere() 分组到一个分组 where() 中,就像这样

$coins = Coin::where(function($query) {
    return $query->where('name', 'like', '%'.$this->search.'%')
        ->orWhere('symbol', 'like', '%'.$this->search.'%');
    })
    ->when($this->filter_buy_status, function($query, $status) {
        return $query->where('buy_status' , $this->filter_buy_status);
    })
    ->get();