You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 12:30:08