ChatGPT解决这个技术问题 Extra ChatGPT

Laravel Eloquent: eager loading of multiple nested relationships

What laravel says:

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

What I need is something like this

$books = App\Book::with('author[contacts,publishers]')->get();

where we eager load multiple relationships within a relationship.

Is this possible?


o
oseintow

You can do

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

just to add, it will fetch the corresponding author data as well ofcourse.
Follow-up: I have a much more complex model and want to return a single collection, but like the original poster, wish I could use multiple nested relationships at a lower child level like $event = event::with(['streams.experiences.selectors.['digitalprops.frames','filters']','streams.datacaptures'])->find($eventcode);
@Todd How do you execute this code in Laravel? $event = event::with(['streams.experiences.selectors.['digitalprops.frames','filters']','streams.datacaptures'])->find($eventcode);. It shouldn't work...!
Right @tisuchi -- I said I WISH I could... sorry for the confusion.
does author is table name or what?
E
Elisha Senoo

Laravel documentation on eager loading recommends listing the relationships in an array as follows:

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

You can have as many relationships as desired. You can also specify which columns should be included for a relationship like this:

//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();

You may also add constrains as follows:

$books = App\Book::with(['author: id, name, email', 'author.contacts' => function ($query) {
                                          $query->where('address', 'like', '%city%');
                                     }, 'author.publishers'])->get();

This is the best overview how to eager load efficiently!
This looks amazing! Thanks for your input!
J
Jonathan Omar Moreno

So, now you can try

$books = App\Book::with(['author' => function($author){
     $author->with(['contacts', 'publishers'])->get();
}])->get();

I think that ->get() is not needed at all within the closure
C
Christos Lytras

When eager load nested relationships and we want to select just some columns and not all using relationship:id,name, always include the foreign key to the nested models, else they won't load at all.

Fort example, we have orders that have identities that have addresses.

This will not load the address:

User::orders()
    ->with('identity:id,name', 'identity.address:id,street')

This will load the address because we have supplied the address_id foreign key:

User::orders()
    ->with('identity:id,address_id,name', 'identity.address:id,street')

关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now