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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:27:34