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 多对多关系检查与中间表的主要内容,如果未能解决你的问题,请参考以下文章