我有3个表描述用户,角色和role_user。这些看起来像这样:
users -> id, name
roles -> id, name
role_user -> user_id, role_id
在我的用户班中,我有:
public function roles()
{
return $this->belongsToMany('Role');
}
这里的目标当然是允许用户拥有多个角色。
我可以像User::with('roles')->get()
这样的查询工作正常。
我想要的只是选择具有特定角色的用户,理想情况下是按名称指定的,但如果需要,可以通过ID进行选择。我如何使用Eloquent做到这一点?
答案 0 :(得分:10)
在belongsToMany
模型
Role
关系
class Role extends Eloquent {
public function users() {
$this->belongsToMany('Users');
}
}
然后使用以下Eloquent Query。
$role = Role::with('users')->whereName($name)->first();
您可以访问$name
角色为$role->users
的所有用户。
答案 1 :(得分:5)
tharumax的答案完全有效,非常有用。唯一的问题是如果你想用其他东西运行查询。让我们说,具有admin
角色并在2014年之前注册的用户。或者如果您想将其用作范围,则无法按照自己的方式进行操作。
这是另一种方式,但直接在查询上(尽管这个按id搜索):
User::join('role_user', 'users.id', '=', 'role_user.user_id')
->where('role_user.role_id',$id)->get();
如果需要,您可以创建一个范围,以便更轻松地进行语法和管理。例如,我想让角色为admin
的用户。
范围:
// Inside User model
public function scopeAdmins($query)
{
return $query->join('rol_user', 'users.id', '=', 'rol_user.user_id')
->where('rol_user.rol_id', id_of_admin );
}
然后您可以轻松检索执行此操作的所有admin
用户(如果需要,还可添加其他条件):
User::admins()->get();