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

我有两张桌子,还有.一个可以有很多,一个只属于一个。UserPostUserpostspostuser

在我的模型中,我有一个关系...UserhasMany

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

在我的模型中,我有一个关系...postbelongsTo

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()


答案 1

好吧,我找到了解决方案。它可以通过将函数作为数组的第二个索引传入来完成,例如closurewith()

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

它只会从其他表中选择和。我希望这将有助于其他人。idusername


请记住,主键(在本例中为 id)必须是 中的第一个参数,才能实际检索必要的结果。$query->select()


答案 2

从Laravel 5.5开始,你可以这样做:

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

关心这个领域,如文档中所述:idforeign keys

使用此功能时,应始终在要检索的列列表中包含 id 列和任何相关的外键列。

例如,如果用户属于某个团队并具有作为外键的列,则当您未指定team_id$post->user->teamteam_id

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

此外,如果用户属于帖子(即表中有一列),那么您需要像这样指定它:post_idusers

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

否则将为空。$post->user


推荐