>假设:
class List extends Model
{
public function items(){
return $this->hasMany(Items::class, 'c.class_id', 'class_id')
->rightjoin('items_classes as c', 'c.items_id', '=', 'items.id');
}
}
问题是 Eloquent 将items
附加到外键字段,最终查询是:
SELECT * FROM items
RIGHT JOIN items_classes as c ON c.items_id = items.id
// here it is
WHERE items.c.class_id = 10
即使使用DB::raw('c.class_id')
也不能解决问题。
如果您注意到hasMany
关系方法的签名:
return $this->hasMany(Model::class, 'foreign_key', 'local_key');
这意味着当Laravel进行查询时,它将foreign_key
第二个参数视为Model::class
中定义的table
列。
为了简化您的情况:
return $this->hasMany(Items::class, 'c.class_id', 'class_id')->...
暂时将右边连接放在一边,Laravel正在考虑c.class_id
作为Item::class
表的外键,这确实是表items
。
所以结果查询是:
SELECT * FROM items WHERE items.c.class_id = 10
然后,当您添加正确的连接时,laravel只需添加到主查询中并使其:
SELECT * FROM items
RIGHT JOIN items_classes as c ON c.items_id = items.id
WHERE items.c.class_id = 10
Laravel不会在关系中引用items_classes
,因为您将List
模型与Item::class
而不是ItemClass::class
相关联。
我不确定您需要的数据,但看看您是否可以使用以下内容:
class List extends Model
{
public function items(){
return $this->hasMany(Items::class, 'c.class_id', 'class_id');
}
}
List::with(['items', function($q){
return $q->->rightjoin('items_classes as c', 'c.items_id', '=', 'items.id');
}])->get();
希望这能让您了解如何更新关系以获取所需的查询。如果您添加所需的表结构和数据,我可以为您更新带有关系的答案。