通过 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_id
、product_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');
}
文档:
有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_id
、product_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');
}
文档: