提问者:小点点

Laravel路由模型绑定与关系


我想知道是否有可能返回与laravels路由模型绑定的关系?

假设是一个具有与其他用户“朋友”关系的用户模型,我希望从路由或控制器返回用户信息和关系。

例如对于路由domain.tld/user/123

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

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

    return Response::json($user);

});

这会很好地返回用户信息,但我也需要关系,有没有简单/适当的方法来实现这一点?

我知道我能做到

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

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

});

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

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

});

但我怀疑有更好的办法。


共3个答案

匿名用户

您不希望像Matt Burrow建议的那样,在每个查询上都急于加载关系,而只是为了让它在一个上下文中可用。这是低效的。

相反,在控制器操作中,您可以在需要时“按需”加载关系。因此,如果您使用route–model绑定为控制器操作提供一个用户实例,但您还需要朋友关系,您可以这样做:

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

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

匿名用户

您可以使用用户模型中的属性填充$。就这样,;

protected $with = ['friends'];

这将自动为您加载关系数据。

请注意:这将适用于每个用户模型查询。

如果您不想一直加载好友,那么可以将其绑定到路由中的参数,如下所示;

Route::bind('user_id', function($id) {
    return User::with('friends')->findOrFail($id);
});

Route::get('/user/{user_id}', 'BlogController@viewPost');

匿名用户

Martin Bean的响应可能不是您想要解决这个问题的方式,只是因为它为您的控制器引入了n 1:

1) 它必须通过路由模型绑定加载用户,然后。。。。

2)它现在加载关系为朋友

然而,他是正确的,你可能不想每次都加载关系。

这就是为什么Matt Burrow的解决方案可能更好(他绑定了一个不同的值:您可以使用类似于{user}的东西,而不是{user},并将其与{user}分开绑定。。。

就我个人而言,我认为如果您只需要为该路由加载friends,我只需传递$userId(无绑定),然后从以下内容开始控制器方法:

$user=user::with('friends')-

您可以让Laravel自动处理ModelNotFoundException(就像它在路由模型绑定中所做的那样),也可以将其包装在try/catch中

相关问题