Laravel Eloquent如何过滤同时满足当前表与父表条件的指定行
问题原因
你的查询返回空是两个错误共同导致的:
- 关联语法错误:
leftJoin传入的表名、关联字段前缀了多余的.,会造成SQL语法错误,无法正确关联订单表 - 过滤逻辑错误:当前嵌套where内用AND连接两个不等值判断,实际语义是仅返回同时满足orders.type≠1、order_payments.item_id≠1的记录,会把大量符合要求的记录误过滤,和需求完全不匹配。你的实际需求是仅排除「orders.type=1 且 order_payments.item_id=1」同时成立的记录,其余记录全部保留。
修复后的代码
修正关联写法,同时把要排除的组合条件用whereNot包裹即可,其余原有筛选条件可以正常追加:
OrderPayments::leftJoin('orders', 'orders.id', 'order_payments.orderid') ->whereNot(function ($query) { $query->where('orders.type', '1') ->where('order_payments.item_id', '1'); }) // 追加其他原有筛选条件 ->where(/* 其他你的业务筛选条件 */) ->get();
逻辑说明
上述写法生成的SQL过滤片段为WHERE NOT (orders.type = '1' AND order_payments.item_id = '1'),匹配规则完全符合需求:
- 订单type=1,但支付记录item_id≠1:正常返回
- 支付记录item_id=1,但关联订单type≠1:正常返回
- 仅当两个条件同时命中时,对应支付记录行才会被剔除
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

