Laravel 10 Eloquent查询为何出现`radio_content_products`.`id` IS NULL条件?
问题分析与解决
问题原因
你在循环中错误调用了$this->product(),而非当前循环项$content->product()。这里的$this指向执行get()的原模型实例(或查询构造器上下文),该实例的关联外键字段为空,Laravel构建关联查询时,会自动基于当前模型的外键值生成条件——当外键为空时,就会追加radio_content_products.id is null的限制。你手动添加的where('id', '=', $content->content_product_id)是额外条件,最终SQL便同时包含了这两个部分。
解决方案
将循环内的$this->product()替换为$content->product(),这样会基于每个$content实例的关联字段构建正确查询,不会出现多余的is null条件:
$contentList = $this->get(); foreach($contentList as $content){ $content->product()->where('id', '=', $content->content_product_id)->ddRawSql(); }
额外优化建议
如果content_product_id是content模型与product模型关联的外键,你完全不需要手动编写where条件。直接调用关联属性(注意是属性而非方法)即可获取对应产品,Laravel会自动处理查询逻辑:
$contentList = $this->get(); foreach($contentList as $content){ // 获取关联的产品模型 $product = $content->product; // 若需查看生成的SQL,可调用关联方法: // $content->product()->ddRawSql(); }
内容的提问来源于stack exchange,提问作者michael-mammut
相关产品推荐
相关产品推荐

