从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中的多对多关系中获取单列的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Laravel 中的多对多关系获取模型

刀片模板中的多对多关系中的 Laravel 嵌套查询

如何在Laravel中的多对多关系中添加“别名”?

如何从雄辩关系中的第三个表中获取数据雄辩的多对多关系

Laravel 上的多对多问题关系

php Laravel中的多对多关系来自一系列ID Raw