雄辩的hasMany在联合表上有很多外键

时间:2019-02-20 08:47:44

标签: laravel laravel-5 eloquent eloquent--relationship

假设:

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');
    }
}

问题在于,口才是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')也不能解决问题。

1 个答案:

答案 0 :(得分:0)

如果您注意到hasMany关系方法的签名:

return $this->hasMany(Model::class, 'foreign_key', 'local_key');

这意味着Laravel在进行查询时,会将第二个参数foreign_key视为table中定义的Model::class的列。

为简化您的案例:

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();

希望这可以使您了解如何更新关系以获得所需的查询。如果您添加了所需的表结构和数据,我可以为您更新带有关系的答案。