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

新手上路,请多包涵

我有两张桌子, UserPost 。一个 User 可以有很多 posts 和一个 post 只属于一个 user

在我的 User 模型中,我有一个 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() 的特定列。我怎样才能做到这一点?

原文由 Awais Qarni 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 843
2 个回答

好吧,我找到了解决方案。可以通过在 with() 中传递 closure 函数作为数组的第二个索引来完成

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

它只会从其他表中选择 idusername 。我希望这对其他人有帮助。


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

原文由 Awais Qarni 发布,翻译遵循 CC BY-SA 4.0 许可协议

请注意,如果您不添加 key 列,它将不会返回任何内容。如果您只想显示 username 而没有 id 您可以改为在模型中定义 $visible/$hidden 属性,如下所示:

应用程序/模型/User.php

 protected $visible = ['username'];

然后它将只检索 username 列:

 Post::with('user')->get();

隐藏 key 列:

或者,您可以隐藏 key 列,然后仅检索您想要的列。

应用程序/模型/User.php

 protected $hidden = ['id'];

指定您想要的列,包括 key 否则它不会返回任何内容,但这实际上只会返回用户名,因为 id$hidden

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

原文由 caiohamamura 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题