从laravel中的多对多关系中获取单列
Posted
技术标签:
【中文标题】从laravel中的多对多关系中获取单列【英文标题】:Get single column from many-to-many relationship in laravel 【发布时间】:2020-12-26 12:52:00 【问题描述】:我使用数据透视表 'role_user'
在 User 模型和 Role 模型之间创建了多对多关系。我想为经过身份验证的用户检索单个列 'role_name'
作为数组。
这是我对用户和角色模型的配置:
用户.php:
public function roles()
return $this->belongsToMany(Role::class);
角色.php:
public function users()
return $this->belongsToMany(User::class);
AuthController.php:
public function details()
$user = Auth::user();
$user['role'] = $user->roles;
return response()->json(['success' => $user], 20);
laravel 响应如下:
"user":"id":4,"first_name":"Jill","last_name":"mclane","email":"jill@g.co","role":["id":1,"role_name":"vendor","pivot":"user_id":4,"role_id":1]
我想获取role_name
列作为选定用户的数组。例如。 role:['vendor','admin']
。我使用了select
方法,但它返回pivot
以及其他列:
$user['role'] = $user->roles()->select('role_name')->get();
//returns "user":"id":4,"first_name":"Jill","last_name":"mclane","email":"jill@g.co","role":["role_name":"vendor","pivot":"user_id":4,"role_id":1]
【问题讨论】:
【参考方案1】:您可以使用集合上的pluck
方法来执行此操作:
$user['role'] = $user->roles->pluck('name');
您在访问$user->roles
时已经加载了roles
关系。虽然它没有显示在您当前的输出中。
查询生成器也存在此方法。
$user['role'] = $user->roles()->pluck('name');
这不会加载关系。
Laravel 7.x Docs - Collections - Available Methodspluck
Laravel 7.x Docs - Queries - Retrieving Results - Retrieving A List Of Column Valuespluck
【讨论】:
【参考方案2】:使用 API 资源是解决此类问题的一种简单而有效的方法。这样您就可以自定义来自控制器的 JSON 响应。
见:https://laravel.com/docs/7.x/eloquent-resources
【讨论】:
【参考方案3】:使用first()
函数获取单条记录
$user['role'] = $user->roles()->first()->role_name;
【讨论】:
以上是关于从laravel中的多对多关系中获取单列的主要内容,如果未能解决你的问题,请参考以下文章