Laravel 5.5中whereHas()处理NULL值无效问题求助
解决Laravel 5.5中whereHas筛选关联模型NULL字段无效的问题
看起来你遇到的问题是whereHas没有正确过滤出关联objectives中entity_id和quarter_id均为NULL的Plan数据,反而返回了所有结果。我来帮你分析可能的原因和解决方案:
1. 明确字段归属,避免歧义
首先要确认entity_id和quarter_id确实是objectives表中的字段,没有拼写错误。如果你的Plan表也有同名字段,必须在查询中明确指定表名,防止字段冲突导致筛选失效:
$plans = Plan::with('objectives', 'objectives.keyResults') ->whereHas('objectives', function($query) { // 明确指定表名,消除字段歧义 $query->whereNull('objectives.entity_id') ->whereNull('objectives.quarter_id'); }) ->where('companyKey', Auth::user()->companyKey) ->get();
2. 匹配你的实际需求:存在VS全部符合
你的原代码用whereHas,它的逻辑是只要Plan存在至少一个满足条件的objectives,就会被选中。如果你实际想要的是「Plan的所有objectives都必须满足两个字段为NULL」,那whereHas就不适用了,应该改用whereDoesntHave反向排除不符合条件的记录:
$plans = Plan::with('objectives', 'objectives.keyResults') // 排除存在任意一个不符合条件的objectives的Plan ->whereDoesntHave('objectives', function($query) { $query->whereNotNull('entity_id') ->orWhereNotNull('quarter_id'); }) // 可选:如果需要确保Plan至少关联了一个objectives,加上这一行 ->whereHas('objectives') ->where('companyKey', Auth::user()->companyKey) ->get();
这段代码的逻辑是:先剔除所有包含entity_id或quarter_id不为NULL的objectives的Plan,剩下的就是所有关联的objectives都满足两个字段为NULL的Plan。如果不需要包含没有关联objectives的Plan,就加上额外的whereHas('objectives')条件。
3. 检查关联定义是否正确
最后确认你的Plan模型中objectives关联的定义是否正确,比如:
// Plan模型中的关联方法 public function objectives() { // 确保关联的模型和外键符合你的数据库结构 return $this->hasMany(Objective::class); }
如果关联的外键不是Laravel默认的plan_id,需要在关联定义中明确指定,否则关联查询会出错,导致whereHas无法正确过滤。
内容的提问来源于stack exchange,提问作者Zahra Mumtaz
相关产品推荐
相关产品推荐

