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
、$user
、auth()->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();
在 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
、$user
、auth()->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();