Eloquent在联合表上有很多外键

问题描述 投票:0回答:1

假设这个:

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')也无法解决问题。

laravel laravel-5 eloquent eloquent--relationship
1个回答
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')->...

Laradvel暂时离开了右边的连接,正在考虑将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();

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

© www.soinside.com 2019 - 2024. All rights reserved.