8

我有 3 个描述用户、角色和角色用户的表。这些看起来像这样:

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 做到这一点?

4

2 回答 2

10

在模型中写一个belongsToMany关系Role

    class Role extends Eloquent {
        public function users() {
            $this->belongsToMany('Users');
        }
    }

然后使用以下雄辩的查询。

    $role = Role::with('users')->whereName($name)->first();

您可以访问所有$name角色为 的用户$role->users

于 2013-11-12T20:38:51.913 回答
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();
于 2015-03-12T15:46:11.447 回答