我有两个表,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()的特定列。我该怎么做呢?


当前回答

EmployeeGatePassStatus::with('user:id,name')->get();

其他回答

如果你使用php7.4或更高版本,你也可以使用箭头函数,这样看起来更干净:

Post::with(['user' => fn ($query) => $query->select('id','username')])->get();

从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将为空。

有条件的尝试。

$id = 1;
Post::with(array('user'=>function($query) use ($id){
    $query->where('id','=',$id);
    $query->select('id','username');
}))->get();

现在你可以在Collection实例上使用pluck方法:

这将只返回Post模型的uuid属性

App\Models\User::find(2)->posts->pluck('uuid')
=> Illuminate\Support\Collection {#983
     all: [
       "1",
       "2",
       "3",
     ],
   }
EmployeeGatePassStatus::with('user:id,name')->get();