2013-11-12 7 views
7

У меня есть 3 таблицы, описывающие пользователей, роли и role_user. Они выглядят так:Laravel eloquent - Многие для многих, выберите только соответствующие таблицы

users -> id, name 
roles -> id, name 
role_user -> user_id, role_id 

В моем классе пользователя у меня есть:

public function roles() 
{ 
    return $this->belongsToMany('Role'); 
} 

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

Я могу сделать запрос, например, User::with('roles')->get() который отлично работает.

Однако я хочу только выбрать пользователей, которые имеют определенную роль, идеально заданные по имени, но при необходимости это может быть по идентификатору. Как это сделать с помощью Eloquent?

ответ

10

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

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

Затем используйте После красноречивый Query.

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

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

+0

Это полностью противоположно тому, что я пытался - очевидно, когда вы знаете, как! –

+0

Действительно - от многих к многим, это запутывает, поскольку фактически используется функция «ownToMany», когда вы хотите сказать «hasMany» - «hasMany», однако, уже используется при выполнении отношений от 1 до многих. Таким образом, вы в конечном итоге используете «ownToMany», когда это больше похоже на «ownByMany» ... или что-то в этом роде. – fideloper

5

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

Это еще один способ, но непосредственно на запрос (хотя это один поиск по идентификатору):

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(); 
Смежные вопросы