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


当前回答

您可以试试这段代码。在laravel 6版本中进行了测试。

Controller code
 public function getSection(Request $request)
{

  Section::with(['sectionType' => function($q) {
      $q->select('id', 'name');
  }])->where('position',1)->orderBy('serial_no', 'asc')->get(['id','name','','description']);
  return response()->json($getSection);
}
Model code
public function sectionType(){
    return $this->belongsTo(Section_Type::class, 'type_id');
}

其他回答

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

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

在Post模型中:

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

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

注意,如果您不添加键列,它将不会返回任何东西。如果你想只显示用户名而不显示id,你可以在Model中定义$visible/$hidden属性,如下所示:

应用/模型/用户.php

protected $visible = ['username'];

然后它将只检索用户名列:

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

隐藏键列:

或者,您可以隐藏键列,然后只检索您希望的列。

应用/模型/用户.php

protected $hidden = ['id'];

指定你想要包含键的列,否则它不会返回任何东西,但这实际上只会返回用户名,因为id是$hidden。

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

还有另一种方法可以加载特定的列

public function show(Post $post)
{
    $posts = $post->has('user')->with('user:id,name,email,picture')->findOrFail($post->id);
    return view('your_blade_file_path',compact('posts);
}

在Post模型中,你也应该有用户关系

public function user()
{
    return $this->belongsTo( User::class, 'user_id')->withDefault();
}

注意:Laravel文档中提到了它。

https://laravel.com/docs/8.x/eloquent-relationships#eager-loading-specific-columns

在我的用户模型中使用belongsToMany关系时,我也遇到了同样的问题。

经过长时间的搜索和试验和测试方法。我找到了这个答案

您必须确保从关系的任何一方选择了关系所需的id和任何外键。这使得Eloquent能够匹配父母和孩子。

原创版权归https://stackoverflow.com/a/64233242/1551102所有

所以我包括了

Groups::select('groupid')
...

而且效果很好。尽管现在我想知道如何在取回后隐藏groupid字段。 我知道我可以简单地遍历数组并删除它。但是还有其他方法吗?可能是一个更简单更好的方法。