从 laravel 中的多对多关系中获取单列

Get single column from many-to-many relationship in laravel

我在 User 模型和 Role 模型之间创建了多对多关系 table 'role_user'.我想为经过身份验证的用户检索单个列 'role_name' 作为数组。

这是我的用户和角色模型配置:

User.php:

public function roles()
{
    return $this->belongsToMany(Role::class);
}

Role.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 方法,但它 returns 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}}]}}

使用first()函数获取单条记录

$user['role'] = $user->roles()->first()->role_name;

处理此类问题的一种简单而有效的方法是使用 API 资源。这样您就可以自定义来自控制器的 JSON 响应。

参见:https://laravel.com/docs/7.x/eloquent-resources

您可以在集合上使用 pluck 方法来执行此操作:

$user['role'] = $user->roles->pluck('name');

虽然您在访问 $user->roles 时加载了 roles 关系。虽然它没有显示在您当前的输出中。

此方法也适用于查询生成器。

$user['role'] = $user->roles()->pluck('name');

这不会加载关系。

Laravel 7.x Docs - Collections - Available Methods pluck

Laravel 7.x Docs - Queries - Retrieving Results - Retrieving A List Of Column Values pluck