通过 laravel 关系加速查询

Speed up query through laravel relationships

有3个型号:

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

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

First->通过 first_id 加入了连接 Connection->通过 first_id 加入 First,并通过 product_id 加入 Second Second -> 通过 product_id

加入连接

因此:第一个通过连接 first_idproduct_id

连接到第二个

是否可以使用 HasManyThrough 之类的东西来做到这一点?

感谢您的宝贵时间

在您的第一个模型上:

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

根据您的描述,列名应该有效。

在 Tinker 中,您可以通过执行 First::first()->second.

之类的操作来验证它是否正确连接

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

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

会是$first->second->third; //没有多少直通关系需要

如果您的 First 模型和 Second 模型共享 hasMany-belongs 关系,那么您需要使用 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...
        );
    }
}

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

嵌套预加载 要急切加载嵌套关系,您可以使用 "dot" 语法。例如,让我们在一个 Eloquent 语句中加载所有图书的作者和作者的所有个人联系人:

$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