路由模型绑定选择具有关系的特定列



路线:

Route::get('/posts/{post}', [PostController::class, 'show']);

控制器:

public function show(Post $post){
$postData = $post->load(['author' => function($query){
$query->select('post_id', 'name');
}])
->get(['title', 'desc', 'created_date'])
->toArray();
}

这将返回数据库中的所有帖子,而我只想将选定的帖子传递给show函数。

因此,如果我访问/posts/3,它应该显示与id=3的帖子相关的数据,而不是所有帖子。

结果应该是一个只包含选定帖子的数组。

当您在控制器内部时,您已经拥有了所需的Post。如果你调用get,你会得到一个新查询的所有帖子。

要从关系中选择特定列,可以这样做:

public function show(Post $post)
{
$post->load('author:id,name,age'); // load columns id, name, age from author
}

请注意,需要包含id

要为Post指定列,无法按路由执行,唯一的方法是覆盖Laravel解析隐式绑定的方式。为此,您可以将其添加到Post模型类中:

public function resolveRouteBinding($value, $field = null)
{
return $this->whereKey($value)->select(['id', 'body', 'author_id'])->firstOrFail();
}

请注意,包含author_id是随后在Controller方法中加载Author所必需的。还要记住,这将影响所有隐式加载Post的路由。

请不要在模型上使用get()函数。

public function show(Post $post) 
{
$post->load(['author' => function ($query) {
$query->select(['post_id', 'name']);
]);
dd($post->toArray());
}

顺便说一句,作者不应该有post_id,因为作者可以有多个帖子。您应该更新数据库结构,否则您在控制器中做得不对。(我的坏,谢谢@techno(

相关内容

最新更新