Laravel Route model binding with relationship

Keet picture Keet · Nov 12, 2014 · Viewed 7.6k times · Source

I am wondering if it is possible to return a relationship with laravels Route model binding ?

Say is a have a user model with a relationship 'friends' to other users, and I want to return both the user info and the relationship from a route or controller.

eg for the route domain.tld/user/123

Route::model('user', 'User');

Route::get('/user/{user}', function(User $user) {

    return Response::json($user);

});

this will return me the user info fine but I also want the relationships, is there any easy/proper way to do this ?

I know I can do this

Route::get('/user/{user}', function((User $user) {

    return Response::json(User::find($user['id'])->with('friends')->get());

});

or

Route::get('/user/{id}', function(($id) {

   return Response::json(User::find($id)->with('friends')->get());

});

but I suspect there may be a better way.

Answer

Martin Bean picture Martin Bean · Oct 5, 2016

You don’t want to eager-load relationships on every query like Matt Burrow suggests, just to have it available in one context. This is inefficient.

Instead, in your controller action, you can load relationships “on demand” when you need them. So if you use route–model binding to provide a User instance to your controller action, but you also want the friends relationship, you can do this:

class UserController extends Controller
{
    public function show(User $user)
    {
        $user->load('friends');

        return view('user.show', compact('user'));
    }
}