Laravel 6中Left Outer Join未按预期返回数据问题排查求助
问题原因及解决方案
问题出在你对orders表的where条件上!
虽然你用了leftJoin来关联orders表,但后续的->where('orders.agent_reg_id',$current_agent_id)直接把左连接的效果变成了内连接——因为候选人1在orders表中没有对应记录,所以orders.agent_reg_id的值是null,而null和任何值的相等判断都会返回false,这条记录就被过滤掉了。
两种可行的解决方案
方案1:将orders的条件移到join的ON子句中
把左连接的逻辑改成在关联时就限定订单的agent_id,这样没有对应订单的候选人记录依然会被保留:
->leftJoin('orders', function($join) use ($current_agent_id) { $join->on('candidates.id', '=', 'orders.candidate_id') ->where('orders.agent_reg_id', $current_agent_id); })
这样左连接只会匹配当前代理的订单,没有订单的候选人依然会出现在结果集中,对应的orders字段会是null。
方案2:调整WHERE条件,允许orders字段为null
修改原来的where('orders.agent_reg_id',$current_agent_id)条件,让它同时接受null的情况:
->where(function($query) use ($current_agent_id) { $query->where('orders.agent_reg_id', $current_agent_id) ->orWhereNull('orders.agent_reg_id'); })
这个逻辑表示:要么订单属于当前代理,要么没有关联订单,这样候选人1的记录就会被保留下来。
额外提示
因为你在select中包含了orders.payment_status和orders.phone,没有订单的候选人这些字段会是null,在视图渲染的时候记得做好空值处理(比如用{{ $item->payment_status ?? '未支付' }}这样的语法)。
内容的提问来源于stack exchange,提问作者Ashiful Islam Prince
相关产品推荐
相关产品推荐

