在Laravel Eloquent中使用“with()”函数获取特定的列

我有两个表UserPost One User有很多posts ,一个post只属于一个user

在我的User模型中,我有许多关系

 public function post(){ return $this->hasmany('post'); } 

而在我的post模式,我有belongsTo像关系

 public function user(){ return $this->belongsTo('user'); } 

现在我想要使用Eloquent with()join这两个表Eloquent with()但希望第二个表中的特定列。 我知道我可以使用query Builder但我不会使用它。 当我在post模式写我

 public function getAllPosts() { return Post::with('user')->get(); } 

它运行以下queires

 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()特定列。 我怎样才能做到这一点?

那么我find了解决scheme。 可以通过在with()传递一个closure函数作为数组的第二个索引来完成

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

它只会从其他表中selectidusername 。 我希望这会帮助别人。


请记住,$ query-> select()中的主键(在这种情况下为id)是实际检索必要结果所必需的。

在您的Post模型中

 public function user() { return $this->belongsTo('User')->select(array('id', 'username')); } 

原来的功劳归于Laravel Eager Loading – 仅加载特定列

走相反的路(hasMany):

 User::with(array('post'=>function($query){ $query->select('id','user_id'); }))->get(); 

不要忘记包含外键(假设它是user_id在这个例子中)来解决这个关系,否则你的关系将得到零结果。

在您的Post模式中:

 public function userWithName() { return $this->belongsTo('User')->select(array('id', 'first_name', 'last_name')); } 

现在你可以使用$post->userWithName

请注意,如果你只需要从表中的一列,然后使用“列表”是相当不错的。 在我的情况下,我正在检索用户喜欢的文章,但我只想要文章ID的:

 $favourites = $user->favourites->lists('id'); 

返回一个ID数组,例如:

数组([0] => 3 [1] => 7 [2] => 8)

你可以在Laravel 5.5中这样做:

 Post::with('user:id,username')->get(); 

照顾文档中所述的id字段:

使用此function时,应始终在要检索的列的列表中包含id列。

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

这将只返回Post modeluuid属性

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