0

假设:

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

问题是 Eloquentitems在外键字段前面加上最后的查询是:

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

4

1 回答 1

1

如果您注意到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')->...

将 rightjoin 暂时搁置一旁,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在关系中引用,因为您将ListModel 与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();

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

于 2019-02-20T11:30:06.887 回答