Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Eager loading with route model binding

I have a controller function like this

public function show(NovelRequest $request, Novel $novel)
{
    // load the chapters
    $novel->chapters;

    // return the detail view of a novel
    return view('novels.show', compact('novel'));
}

I receive a novel object because i m using route model binding. However, I'd like to load more than the chapters. Since it would cause many request if i now do something like

$novel->chapters;
$novel->bookmarks;
...

I wondered if theres a way to load "multiple" relations when i already have the novel object. Usually i would to something like

Novel::with('chapters', 'bookmarks')-> ...

However, I already have the novel object so i would like to not look it up a second time.

like image 312
Frnak Avatar asked Nov 03 '16 15:11

Frnak


2 Answers

There is “Lazy Eager Loading“. The syntax is $novel->load('chapters', 'bookmarks');

like image 95
Gordon Freeman Avatar answered Oct 23 '22 15:10

Gordon Freeman


We can eager load the needed relations by customizing the resolution logic (for route model binding) by defining a resolveRouteBinding method on the model.

// In the Novel model
public function resolveRouteBinding($value)
{
    return $this->with(['chapters', 'bookmarks'])->where($this->getRouteKeyName(), $value)->firstOrFail();
}

https://laravel.com/docs/6.x/routing#explicit-binding

like image 36
Abdrhmn Avatar answered Oct 23 '22 15:10

Abdrhmn