路线:
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(