Laravel Eloquent: 多个嵌套关系的预加载
Laravel Eloquent: eager loading of multiple nested relationships
laravel 说了什么:
$books = App\Book::with('author.contacts')->get();
我需要的是这样的东西
$books = App\Book::with('author[contacts,publishers]')->get();
我们渴望在一个关系中加载多个关系。
这可能吗?
你可以做到
$books = App\Book::with('author.contacts','author.publishers')->get();
Laravel 关于 eager loading 的文档建议按如下方式列出数组中的关系:
$books = App\Book::with(['author.contacts', 'author.publishers'])->get();
您可以拥有任意多的关系。您还可以指定应为这样的关系包含哪些列:
//only id, name and email will be returned for author
//id must always be included
$books = App\Book::with(['author: id, name, email', 'author.contacts', 'author.publishers'])->get();
您还可以按如下方式添加约束:
$books = App\Book::with(['author: id, name, email', 'author.contacts' => function ($query) {
$query->where('address', 'like', '%city%');
}, 'author.publishers'])->get();
所以,现在你可以试试
$books = App\Book::with(['author' => function($author){
$author->with(['contacts', 'publishers'])->get();
}])->get();
当急于加载嵌套关系并且我们希望 select 仅使用一些列而不是全部使用 relationship:id,name
时,始终包含嵌套模型的外键,否则它们根本不会加载.
例如,我们有 订单 有 身份 有 地址。
这不会加载地址:
User::orders()
->with('identity:id,name', 'identity.address:id,street')
这将加载地址,因为我们提供了 address_id
外键:
User::orders()
->with('identity:id,address_id,name', 'identity.address:id,street')
laravel 说了什么:
$books = App\Book::with('author.contacts')->get();
我需要的是这样的东西
$books = App\Book::with('author[contacts,publishers]')->get();
我们渴望在一个关系中加载多个关系。
这可能吗?
你可以做到
$books = App\Book::with('author.contacts','author.publishers')->get();
Laravel 关于 eager loading 的文档建议按如下方式列出数组中的关系:
$books = App\Book::with(['author.contacts', 'author.publishers'])->get();
您可以拥有任意多的关系。您还可以指定应为这样的关系包含哪些列:
//only id, name and email will be returned for author
//id must always be included
$books = App\Book::with(['author: id, name, email', 'author.contacts', 'author.publishers'])->get();
您还可以按如下方式添加约束:
$books = App\Book::with(['author: id, name, email', 'author.contacts' => function ($query) {
$query->where('address', 'like', '%city%');
}, 'author.publishers'])->get();
所以,现在你可以试试
$books = App\Book::with(['author' => function($author){
$author->with(['contacts', 'publishers'])->get();
}])->get();
当急于加载嵌套关系并且我们希望 select 仅使用一些列而不是全部使用 relationship:id,name
时,始终包含嵌套模型的外键,否则它们根本不会加载.
例如,我们有 订单 有 身份 有 地址。
这不会加载地址:
User::orders()
->with('identity:id,name', 'identity.address:id,street')
这将加载地址,因为我们提供了 address_id
外键:
User::orders()
->with('identity:id,address_id,name', 'identity.address:id,street')