从第一个表中选择特定列,在 Laravel 中进行预加载

Posted

技术标签:

【中文标题】从第一个表中选择特定列,在 Laravel 中进行预加载【英文标题】:select specific columns from first table with eager loading in Laravel 【发布时间】:2021-10-03 00:53:52 【问题描述】:

我已经检查了许多解决方案,以从第一个模型中获取特定列,但在我的情况下没有任何效果。

例如:我想要来自模型 User 的特定列,并且想要通过预先加载而不需要任何连接来获取关系数据。

$users= User::select('name') // get one column from user table
->with(array('role_user' => function($query)
    $query->select('role_name'); // and select one column from pivot table
))
->paginate(3);

当我不使用User::select('name)时,它返回带有急切加载的关系数据,当我使用select时,它返回空数组。

如何使用预先加载从两个表中获取特定列

【问题讨论】:

在使用急切加载时,您还应该始终选择主键和外键 【参考方案1】:

我们永远不知道您项目的架构和关系.. 但我认为您应该这样做

$users = User::select('id','name') 
               ->with(['role_user:id,user_id,role_name'])
               ->paginate(3);

在您的用户模型中,关系必须是

public function role_user()
return $this->belongsToMany(Role::class, 'role_user'); // pivot table name

在你的榜样中

 public function users()
return $this->belongsToMany(User::class, 'role_user'); // pivot table name

【讨论】:

【参考方案2】:

我不完全知道,你是如何定义你的关系的,但是 Laravel 有 some weird behavior:你也应该总是选择主键和外键:

$users= User::select(['id', 'name']) // get one column from user table
->with(array('role_user' => function($query)
    $query->select(['id', 'role_name']); // and select one column from pivot table
))
->paginate(3);

您可以将其简化为:

$users= User::select(['id', 'name']) // get one column from user table
->with(['role_user:id,user_id,role_name']) // and select one column from pivot table
->paginate(3);

【讨论】:

它也在关系中返回空数组,但来自用户模型的 (id, name) 列 您能否edit 您的问题并添加两个表的架构以及模型中的关系?您可能需要将user_id 添加到select() 内的with() @shaedrich 谢谢!有效。需要外键

以上是关于从第一个表中选择特定列,在 Laravel 中进行预加载的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel中选择特定列

Laravel - 使用 Eloquent 从连接关系模型中选择特定列

Laravel 在急切加载时使用 Eloquent 选择特定列

Laravel Raw 语句我可以根据列数据是不是等于另一个表从不同的表中进行选择

在 Laravel Eloquent 中使用关系表中的特定列获取表中的特定列

使用第一个表的输出从第二个表中选择特定数据