通过laravel关系加快查询速度

时间:2019-05-13 13:21:45

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

共有3种型号:

First (first_id)
Connection (connection_id, first_id, product_id)
Second (second_id, product_id)

我想使用laravel关系将三个模型连接在一起

First->通过first_id加入了Connection   Connection->通过first_id加入First,然后通过Second加入product_id   Second->通过product_id

加入Connection

因此:首先通过连接first_idproduct_id

加入了Second

是否可以使用类似HasManyThrough的东西?

感谢您的时间

3 个答案:

答案 0 :(得分:1)

在您的第一个模型上:

public function second () {
    return $this->hasManyThrough(
        Second::class, 
        Connection::class, 
        'product_id', // Foreign key on connection table
        'product_id', // Foreign key on second table
        'first_id', // Local key on first table
        'first_id' // Local key on connection table
    );
}

根据您的描述,列名应该起作用。

在修补程序中,您可以执行First::first()->second之类的操作来验证其是否正确连接。

答案 1 :(得分:1)

这取决于您的第一个模型和第二个模型共享的关系类型以及第二个和第三个模型共享的关系类型。

如果考虑您的第一个模型First和第二个模型Second共享一对一关系,以及Second模型和Third模型共享一个一个关系。

它将是$first->second->third; //没有很多直通关系要求

如果您的First模型和Second模型共享为hasMany-relations关系,则您需要使用hasManyThrough关系

来自doc

的示例
class Country extends Model
{
    public function posts()
    {
        return $this->hasManyThrough(
            'App\Post',
            'App\User',
            'country_id', // Foreign key on users table...
            'user_id', // Foreign key on posts table...
            'id', // Local key on countries table...
            'id' // Local key on users table...
        );
    }
}

答案 2 :(得分:1)

您可以尝试使用嵌套关系。

嵌套的渴望加载 为了渴望加载嵌套关系,可以使用“点”语法。例如,让我们急切地在一项雄辩的陈述中加载本书的所有作者和作者的所有个人联系人:

$books = App\Book::with('author.contacts')->get();

图书模型:

public function author() 
{
    return $this->hasOne('App\Author');
}

作者模型:

public function contacts() 
{
    return $this->hasMany('App\Author');
}

文档:

https://laravel.com/docs/5.8/eloquent-relationships