Фильтрация данных сводной таблицы с помощью моделей Laravel


Допустим, у меня есть три таблицы (это всего лишь пример):

users
   user_id
   username

roles
   role_id
   name

user_roles
    user_id
    role_id
    primary (boolean)

И соответствующие модели laravel:

   class User extends Eloquent {
        public function roles() {
              return $this->belongsToMany('Role')->withPivot('primary');
        }
   }
   class Role extends Eloquent {
         public function users() {
              return $this->belongsToMany('User')->withPivot('primary');
         }
   }

Я хочу получить список всех пользователей, но только с основными ролями в возвращаемом объекте. Если я использую что-то вроде:

$users = User::with('roles')->find(1);

Каждый пользовательский объект будет иметь список всех соответствующих ему ролей. Я хочу, чтобы этот список содержал только основные роли. Есть ли способ сделать это из запроса, без последующей обработки массива $users?

Author: menjaraz, 2013-12-24

2 answers

Попробуйте выполнить следующее:

$users = User::with(array('roles' => function($query)
{
    $query->where('primary', 1); 
}))->find(1);
 9
Author: Anam, 2013-12-24 11:45:25

Я бы предложил вам создать дополнительный метод в вашей пользовательской модели следующим образом:

public function primaryRoles() {
    return $this->roles()->wherePivot('primary', true);
}

Затем используйте что-то вроде:

$users = User::with('primaryRoles')->find(1);

Кроме того, раздел "Ограничения по нагрузке" в документации может иметь значение.

 14
Author: Dkok, 2013-12-24 11:47:21