Laravel 9 + Livewire实现NULL输入时不追加查询条件的方法
在Laravel 9 + Livewire中实现动态筛选(仅非空条件加入查询)
Laravel提供了几种简洁的方式来实现仅当筛选值非空时才添加对应WHERE条件的需求,完全适配Livewire的组件逻辑,下面是几种实用方案:
方案1:使用Laravel的when()方法(推荐)
when()是Laravel查询构造器专门处理条件式查询的工具,它会自动判断第一个参数的真假,只有为真时才执行第二个参数里的查询逻辑。
在你的Livewire组件里可以这么写:
public $supplierID; public $merkID; public $kategoriID; public function getFilteredItemsProperty() { return Item::query() ->when($this->supplierID, function ($query) { $query->where('supplier_id', $this->supplierID); }) ->when($this->merkID, function ($query) { $query->where('merk_id', $this->merkID); }) ->when($this->kategoriID, function ($query) { $query->where('kategori_id', $this->kategoriID); }) ->get(); }
将Item替换成你的实际模型类即可。如果$this->supplierID为null,对应的where逻辑会被直接跳过,完全符合你的需求。
方案2:手动判断非空后添加条件
如果觉得when()不够直观,也可以用基础的条件判断逐个处理:
public function getFilteredItemsProperty() { $query = Item::query(); if ($this->supplierID !== null) { $query->where('supplier_id', $this->supplierID); } if ($this->merkID !== null) { $query->where('merk_id', $this->merkID); } if ($this->kategoriID !== null) { $query->where('kategori_id', $this->kategoriID); } return $query->get(); }
这种写法逻辑直白,适合刚接触Laravel的开发者理解,效果和when()完全一致。
方案3:批量处理筛选条件(多字段场景首选)
如果后续要添加更多筛选字段,可以把筛选属性和数据库字段做成对应数组,循环处理减少重复代码:
public $supplierID; public $merkID; public $kategoriID; public function getFilteredItemsProperty() { $filters = [ 'supplier_id' => $this->supplierID, 'merk_id' => $this->merkID, 'kategori_id' => $this->kategoriID, // 后续加新筛选字段直接在这里追加即可 ]; $query = Item::query(); foreach ($filters as $column => $value) { if ($value !== null) { $query->where($column, $value); } } return $query->get(); }
这种方式扩展性强,新增筛选条件时不需要重复写判断逻辑,只需要在$filters数组中添加对应关系即可。
注意事项
- 确保Livewire组件里的
$supplierID、$merkID、$kategoriID是public属性,这样才能和前端输入框通过wire:model="supplierID"实现双向绑定。 - 如果需要允许空字符串作为有效筛选值,可将判断逻辑调整为
if (!empty($value)),但仅判断null的话用!== null就足够。
内容的提问来源于stack exchange,提问作者Muzakir Nur
相关产品推荐
相关产品推荐

