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