Laravel 多对多获取我没有关系的元素

Laravel Many To Many Get element that I dont have a relationship with

在 laravel 中,多对多关系类似于 Laravel 文档示例中的关系。 https://laravel.com/docs/9.x/eloquent-relationships#many-to-many

users
    id - integer
    name - string

roles
    id - integer
    name - string

role_user
    user_id - integer
    role_id - integer

在我的用户模型中

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

在我的角色模型中

public function users()
{
    return $this->belongsToMany(User::class);
}

如何获得所有与我没有关系的角色。

我试过

$this->availableRoles = Role::doesntHave('users')->get();

但这给了我所有用户都没有的角色

对此有任何提示。

如果您已经有一个 User 实例(我假设这就是 $this 是什么?),那么您可以简单地过滤关系:

$this->availableRoles = Role::whereDoesntHave('users', function ($subQuery) {
  return $subQuery->where('users.id', $this->id);
})->get();

这应该 return 所有 Role 元素,除非该角色与 User$this$userauth()->user(), 等; 根据需要调整).

另一种方法,根据现有角色过滤掉角色:

$this->availableRoles = Role::whereNotIn('id', $this->roles->pluck('id'))->get();

此方法获取 User 实例的 roles.id

您可以查看查询效率并使用最有效的方法,但任何一种方法都应该可以正常工作。

注意:如果$this不是User实例,调整:

$user = User::find($userId); // or `auth()->user()`, etc.

$availableRoles = Role::whereDoesntHave('users', function ($subQuery) use ($user) {
  return $subQuery->where('users.id', $user->id);
})->get();

// OR

$availableRoles = Role::whereNotIn('id', $user->roles->pluck('id'))->get();