Laravel 多对多关系检查与中间表

Posted

技术标签:

【中文标题】Laravel 多对多关系检查与中间表【英文标题】:Laravel Many To Many Relationship Check with intermediate table 【发布时间】:2021-11-12 05:52:53 【问题描述】:

我是新来的,非常希望我没有问重复的问题。

我对编码完全陌生,直接进入了 Laravel,但现在遇到了一个我找不到答案的问题。

我有以下模型设置:

User.php

    public function roles()
    
        return $this->belongsToMany(Role::class, 'user_roles')->as('roles')->withTimestamps();
    

Role.php

有一个表列'name'

    public function users()
    
        return $this->belongsToMany(User::class, 'user_roles');
    

UserRole.php

具有表列“user_id”和“role_id”的中间表

我面临的问题是我想对用户创建一个角色检查,我猜测创建一个中间件将是可行的方法。但是当我想使用以下代码检查用户是否具有角色时:

if (Auth::user()->roles->name == 'manager')
    
        // do something here
    
    else 
        // do something else here
    

我收到一条错误消息,指出此集合实例上不存在“名称”。

我发现我可以遍历用户拥有的角色并显示它们:

$user = User::find(1);
foreach($user->roles as $role)

print $role->name;

但我完全不知道为什么角色检查不起作用。

【问题讨论】:

喜欢吗? Auth::user()->roles()->where('name', 'manager')->first(); 这种方式似乎也可以,但我不太清楚为什么它是 ->roles() 而不是 ->roles 和 ->first() 加法 当你使用一个函数时,它返回 QueryBuilder 而不是一个集合。因此,不是获取所有内容并对其进行排序,而是在查询中排序并检索第一个实例。 哦,好吧,有道理,请解释:) 【参考方案1】:

as Auth::user()->roles 返回所有角色的集合,因此您不能直接应用“==”运算符

【讨论】:

【参考方案2】:

Auth::user()->roles 是角色的集合,是Illuminate\Database\Eloquent\Collection 的一个实例。因此,对于该检查,您可能需要执行以下操作:

if (Auth::user()->roles->contains('name', 'manager') 
    // do something here
 else 
    // do something else here

【讨论】:

这很好用,你!我还没有完全看到 contains 函数。

以上是关于Laravel 多对多关系检查与中间表的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 雄辩的关系 - 多对多 - 获取中间表列

EntityFramework同一张表多对多关系

Laravel5.1 模型 --多对多关系

Laravel eloquent 检查不存在的多对多关系

如何从 laravel 中的中间表(多对多关系)中获取数据

孩子不会更新 Xamarin SQLite 扩展 - 多对多关系