如何将关联查询SQL改写为正确的Laravel ORM Relation查询语句
你之前的代码报错和whereHas返回集合没有关系,问题出在关联条件的写法错误:直接在whereHas外侧写关联表的where条件,Laravel会默认将该条件拼到主表product的查询语句中,而product表本身没有ware_houses.variant_id字段,自然会触发字段不存在的SQL错误。
前置前提
首先确认你已经在Product模型中定义了正确的一对多关联:
// App\Models\Product.php public function ware_houses() { return $this->hasMany(WareHouse::class, 'product_id', 'id'); }
正确实现代码
要对关联表加筛选条件,需要把条件写在whereHas的闭包参数内:
Product::whereHas('ware_houses', function ($query) { // 这里的条件会作用于关联的 ware_houses 表 $query->where('variant_id', 1); })->get();
如果你需要同时返回匹配的关联仓库数据,避免N+1查询问题,可以加上with预加载:
Product::with('ware_houses') ->whereHas('ware_houses', function ($query) { $query->where('variant_id', 1); }) ->get();
上述代码生成的执行SQL和你给出的原生SQL逻辑完全一致,可正常运行。
内容的提问来源于stack exchange,提问作者Timur
相关产品推荐
相关产品推荐

