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

Laravel Eloquent多表查询异常:搜索时未正确限定单公司数据

问题修正方案

你的问题出在逻辑运算符优先级上:OR 的优先级低于 AND,导致生成的SQL中,company_id 等过滤条件只作用在 orWhereHas 的子查询上,而没有覆盖 where('order_number', ...) 的条件,最终导致其他公司的匹配数据也被返回。

修正后的查询代码

$query = $this->shoppingSessionModel->query()
    ->with('cartAddresses');

if (!empty($q)) {
    // 将两个搜索条件包裹在同一个闭包内,确保它们是一组OR关系
    $query->where(function ($subQuery) use ($q) {
        $subQuery->where('order_number', 'LIKE', "%$q%")
            ->orWhereHas('cartAddresses', function($q2) use ($q) {
                $q2->where('address_1', 'LIKE', "%$q%")
                    ->where('is_shipping', 1);
            });
    });
}

$query->where('company_id', $companyId)
    ->where('is_active', 0)
    ->whereNotNull('order_number');

return $query->orderBy('updated_at', 'DESC')
    ->limit();

修正后的SQL逻辑

生成的SQL会变成:

select * from `shopping_sessions` 
where (
    `order_number` LIKE ? 
    or exists (
        select * from `cart_addresses` 
        where `shopping_sessions`.`id` = `cart_addresses`.`shopping_session_id` 
        and `address_1` LIKE ? 
        and `is_shipping` = ?
    )
) 
and `company_id` = ? 
and `is_active` = ? 
and `order_number` is not null 
and `shopping_sessions`.`deleted_at` is null 
order by `updated_at` desc

这样所有搜索匹配的结果都会先经过(订单号匹配 OR 地址匹配)的筛选,再统一应用company_id、is_active等全局过滤条件,确保只返回指定公司的数据。

内容的提问来源于stack exchange,提问作者Vijay Rana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:36:19