在Laravel Eloquent中使用“with()”函数获取特定的列
我有两个表User
和Post
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();
它只会从其他表中selectid
和username
。 我希望这会帮助别人。
请记住,$ 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 model
的uuid
属性
App\Models\User::find(2)->posts->pluck('uuid') => Illuminate\Support\Collection {#983 all: [ "1", "2", "3", ], }