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


当前回答

在Post模型中:

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

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

其他回答

所以,类似于其他的解决方案是我的:

// For example you have this relation defined with "user()" method
public function user()
{
    return $this->belongsTo('User');
}
// Just make another one defined with "user_frontend()" method
public function user_frontend()
{
    return $this->belongsTo('User')->select(array('id', 'username'));
}

// Then use it later like this
$thing = new Thing();
$thing->with('user_frontend');

// This way, you get only id and username, 
// and if you want all fields you can do this

$thing = new Thing();
$thing->with('user');

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

这将只返回Post模型的uuid属性

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

如果你想在laravel eloquent中使用with()获得特定的列,那么你可以使用下面的代码,这最初是由@Adam在他的回答中回答这个相同的问题,答案的主要代码如下所示:

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

所以我在我的代码中使用了它,但它给了我1052的错误:字段列表中的列“id”是不明确的,所以如果你们也面临同样的问题

然后为了解决这个问题,你必须在with()方法的id列之前指定表名,如下所示:

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

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

应用/模型/用户.php

protected $visible = ['username'];

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

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

隐藏键列:

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

应用/模型/用户.php

protected $hidden = ['id'];

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

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

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

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