我有两个表,User和Post。一个用户可以有多个帖子,一个帖子只能属于一个用户。
在我的用户模型中,我有一个hasMany关系…
public function post(){
return $this->hasmany('post');
}
在我的post模型中,我有一个belongsTo关系…
public function user(){
return $this->belongsTo('user');
}
现在我想使用Eloquent with()连接这两个表,但想要第二个表中的特定列。我知道我可以使用查询生成器,但我不想这样做。
在Post模型中,我写…
public function getAllPosts() {
return Post::with('user')->get();
}
它运行以下查询…
select * from `posts`
select * from `users` where `users`.`id` in (<1>, <2>)
但我想要的是…
select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)
当我用…
Post::with('user')->get(array('columns'....));
它只返回第一个表中的列。我想要第二个表中使用with()的特定列。我该怎么做呢?
从Laravel 5.5开始你就可以这样做了:
Post::with('user:id,username')->get();
注意id字段和外键,如文档中所述:
在使用此特性时,应该始终包括id列和
列列表中的任何相关外键列
检索。
例如,如果用户属于一个团队,并且有一个team_id作为外键列,那么如果不指定team_id, $post->user->team为空
Post::with('user:id,username,team_id')->get();
同样,如果用户属于post(即在users表中有一个列post_id),那么你需要这样指定它:
Post::with('user:id,username,post_id')->get();
否则$post->user将为空。
我遇到了这个问题,但涉及到第二层相关对象。@Awais Qarni的答案是在嵌套的选择语句中包含适当的外键。就像在第一个嵌套的选择语句中需要一个id来引用相关模型一样,外键也需要引用第二级相关模型;在本例中是Company模型。
Post::with(['user' => function ($query) {
$query->select('id','company_id', 'username');
}, 'user.company' => function ($query) {
$query->select('id', 'name');
}])->get();
此外,如果您想从Post模型中选择特定的列,则需要在select语句中包含user_id列以便引用它。
Post::with(['user' => function ($query) {
$query->select('id', 'username');
}])
->select('title', 'content', 'user_id')
->get();
您可以试试这段代码。在laravel 6版本中进行了测试。
Controller code
public function getSection(Request $request)
{
Section::with(['sectionType' => function($q) {
$q->select('id', 'name');
}])->where('position',1)->orderBy('serial_no', 'asc')->get(['id','name','','description']);
return response()->json($getSection);
}
Model code
public function sectionType(){
return $this->belongsTo(Section_Type::class, 'type_id');
}
注意,如果您不添加键列,它将不会返回任何东西。如果你想只显示用户名而不显示id,你可以在Model中定义$visible/$hidden属性,如下所示:
应用/模型/用户.php
protected $visible = ['username'];
然后它将只检索用户名列:
Post::with('user')->get();
隐藏键列:
或者,您可以隐藏键列,然后只检索您希望的列。
应用/模型/用户.php
protected $hidden = ['id'];
指定你想要包含键的列,否则它不会返回任何东西,但这实际上只会返回用户名,因为id是$hidden。
Post::with('user:id,username')->get();