在laravel多对多关系中,如laravel文档示例中的关系.

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();

这应该返回所有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();

Php相关问答推荐

否定正则表达式

Laravel:使用 HttpClient 的多个作业(job)的解决方案?

使用正则表达式匹配整个句子后如何匹配一些单词?

来自带有 CONCAT 的 REGEXP 的“重复运算符操作数无效”

WooCommerce 获取产品属性分类值

Laravel:当我想更新我的数据库时,参数太少而无法运行

使用自定义元键和元值扩展 wc_get_orders()

在第一个不是价格小数点或字符串最后一个字符的句点处拆分字符串

是什么导致我的 Laravel 8 应用程序中出现此查询生成器错误?

为什么我在创建新项目时会收到​​ laravel 错误?

PHP setcookie“SameSite = Strict”?

WRONGTYPE 对持有错误值 php 的键的操作

PHP7.1 json_encode() 浮动问题

如何在 Laravel 中验证数组?

此集合实例上不存在属性 [title]

有没有办法在 PHP 中扩展特征?

更改 laravel 视图页面中的日期格式

使用 Postman 通过原始 JSON 发送 POST 数据

仅从 Laravel 集合中获取特定属性

无法创建缓存目录.. 或目录不可写.在 Laravel 中进行无缓存