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
相关产品推荐
相关产品推荐

