Laravel路由模型绑定关系

问题描述 投票:10回答:3

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

说是有关系的“朋友”到其他用户的用户模型,我想同时返回用户信息,并从路径或控制器的关系。

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

});

但我怀疑有可能是一个更好的办法。

php laravel laravel-routing
3个回答
13
投票

可以填充在用户模型中的$with财产。像这样;

protected $with = ['friends'];

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

请注意:这将做它为每个用户模型查询。

如果你不想被加载的朋友所有的时间,那么您可以在您的路线中绑定到参数,像这样;

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

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

16
投票

你不想对每个查询渴望负荷的关系就像Matt Burrow表明,只要有它在一个上下文中可用。这是低效的。

相反,在你的控制器动作,你可以“按需”加载的关系,当你需要他们。所以,如果你使用路由模式结合,以提供User实例添加到控制器动作,但你也想的friends关系,你可以这样做:

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

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

0
投票

马丁·比恩的答复是可能不是你想解决这个问题的方法,不仅是因为它引入了一个N + 1到你的控制器:

1)它必须加载经由路线模型绑定User,然后....

2)现在加载了friends的关系

他是正确的,但是,你可能不希望每次加载关系。

这就是为什么马特伯罗的解决方案可能是更好的(他结合不同的值:不是{user},你可以使用类似{user_with_friends}并分别结合从{user} ...

我个人认为,如果你需要加载friends只有这条路,我只是简单地通过$用户ID(不绑定),以及刚刚开始的控制器方法有:

$user = User::with('friends')->findOrFail($userId);

您可以让Laravel自动处理ModelNotFoundException(如将其与路由模型绑定一样),或在一个try / catch把它包

© www.soinside.com 2019 - 2024. All rights reserved.