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

时间:2013-11-12 20:23:27

标签: laravel laravel-4 eloquent

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

2 个答案:

答案 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();