Laravel雄辩 - 多对多,只选择匹配许多表

Ric*_*haw 7 laravel eloquent laravel-4

我有3个表描述用户,角色和role_user.这些看起来像这样:

users -> id, name
roles -> id, name
role_user -> user_id, role_id
Run Code Online (Sandbox Code Playgroud)

在我的用户类中,我有:

public function roles()
{
    return $this->belongsToMany('Role');
}
Run Code Online (Sandbox Code Playgroud)

这里的目的当然是允许用户拥有多个角色.

我可以做一个User::with('roles')->get()工作正常的查询.

我想要的只是选择具有特定角色的用户,理想情况下由名称指定,但如果需要,可以通过ID.我如何使用Eloquent做到这一点?

tha*_*max 10

belongsToManyRoleModel中写一段关系

    class Role extends Eloquent {
        public function users() {
            $this->belongsToMany('Users');
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后使用以下Eloquent Query.

    $role = Role::with('users')->whereName($name)->first();
Run Code Online (Sandbox Code Playgroud)

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


Mat*_*s17 5

tharumax的答案是完全有效的,非常有用.唯一的问题是如果你想用其他东西运行查询.比方说,具有admin角色并在2014年之前注册的用户.或者如果您想将其用作范围,则无法按照自己的方式进行操作.

这是另一种方式,但直接在查询上(尽管这是通过id搜索):

User::join('role_user', 'users.id', '=', 'role_user.user_id')
      ->where('role_user.role_id',$id)->get();
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以创建一个范围,以便更轻松地进行语法和管理.例如,我想让用户获得角色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 );
}
Run Code Online (Sandbox Code Playgroud)

然后您可以轻松检索admin执行此操作的所有用户(如果需要,还可以添加其他条件):

User::admins()->get();
Run Code Online (Sandbox Code Playgroud)