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

Laravel Eloquent多where与orWhere组合查询问题求助

解决Laravel多字段动态搜索时shop_id过滤失效的问题

你的问题出在orWhere的逻辑上——直接加orWhere会让查询变成「shop_id匹配 或者 某字段匹配搜索词」,自然会跳出当前店铺的范围。要解决这个,得把所有搜索相关的条件打包成一个子查询,让它和shop_id保持AND关系。

直接上可用的代码:

$customers = Customer::where('shop_id', Auth::user()->shop_id)
    ->when($this->search, function ($query) {
        // 把所有搜索字段的OR查询包在闭包里
        $query->where(function ($subQuery) {
            $searchTerm = "%{$this->search}%";
            $subQuery->where('name', 'like', $searchTerm)
                ->orWhere('society', 'like', $searchTerm)
                ->orWhere('reference', 'like', $searchTerm);
        });
    })
    ->paginate(12);

关键逻辑说明:

  1. when($this->search, ...):只有当搜索框有内容时才执行搜索逻辑,空搜索时直接返回当前店铺的所有客户,避免无效查询。
  2. 内层闭包:把三个字段的模糊查询用orWhere组合,这个子查询整体和外层的shop_id = xxx是AND关系,最终的SQL逻辑是:
    SELECT * FROM customers 
    WHERE shop_id = ? 
    AND (name LIKE ? OR society LIKE ? OR reference LIKE ?)
    LIMIT 12
    
    这样就严格限定了只查当前店铺下符合搜索条件的客户。

额外提示:

  • 如果数据量较大,like模糊查询性能会下降,可以考虑给搜索字段加全文索引,用whereRaw配合MATCH AGAINST优化。
  • 确保Livewire组件里已经正确声明了public $search = '';,保证前端输入能同步到后端变量。

内容的提问来源于stack exchange,提问作者Yann Pollet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 12:33:16