拉拉维尔路线模型与关系绑定

2022-08-30 16:17:38

我想知道是否有可能返回与拉拉维尔路线模型绑定的关系?

Say 是一个用户模型,与其他用户建立“朋友”关系,我想从路由或控制器返回用户信息和关系。

例如,对于路线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());

});

但我怀疑可能有更好的方法。


答案 1

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

相反,在控制器操作中,您可以在需要时“按需”加载关系。因此,如果您使用路由模型绑定为控制器操作提供实例,但您也想要这种关系,则可以执行以下操作:Userfriends

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

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

答案 2

可以在用户模型中填充该属性。就像这样;$with

protected $with = ['friends'];

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

请注意:这将为每个用户模型查询执行此操作。

如果您不希望一直加载朋友,那么您可以将其绑定到路由中的参数,例如;

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

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

推荐