使用 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();
我正在尝试使用 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();