Laravel 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 ответов


написать belongsToMany отношения Role модель

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

затем используйте следующий красноречивый запрос.

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

вы можете получить доступ ко всем пользователям, которые имеют $name роль $role->users.


ответ tharumax является полностью действительным и чрезвычайно полезным. Единственная проблема - если вы хотите запустить запрос с другими вещами. Скажем, пользователи, у которых есть admin роль и зарегистрирован до 2014 года. Или, если вы хотите использовать его как прицел, вы не можете сделать это по-своему.

это другой способ, но непосредственно в запросе (хотя этот поиск по id):

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

если вы хотите, вы можете создать рамки для упрощения синтаксиса и управления. e.g I хотите получить пользователей с ролью 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();