我想知道是否有可能返回与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());
});
但我怀疑有更好的办法。
您不希望像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中