Модели фильтров Laravel по количеству родственных моделей - PullRequest
0 голосов
/ 28 августа 2018

У меня есть список групп с пользователями. Группы имеет свойство maximum_users. Пользователи могут зарегистрироваться в группе, только если у них есть свободное место ( Если количество зарегистрированных пользователей в этой группе не превышает maximum_users свойство этой группы ).

  • Как выбрать только группы со свободными местами, где пользователи могут зарегистрироваться?
  • Мне нужно разбить результаты на страницы.

Я могу отфильтровать группы после выбора их с помощью следующего условия:

$group->maximum_users >= $group->users()->count()

но в этом случае нумерация страниц не работает.

Структура таблицы:

groups
    id - integer
    maximum_users - integer

users
    id - integer
    group_id - integer

Модель:

class Group extends Model
{
    public function users()
    {
        return $this->hasMany('App\Models\User');
    }
}


class User extends Model
{
    public function group()
    {
        return $this->belongsTo('App\Models\Group');
    }
}

1 Ответ

0 голосов
/ 28 августа 2018

Как выбрать только группы со свободными местами, где пользователи могут зарегистрироваться? Мне нужно разбить результаты на страницы.

Я бы настоятельно рекомендовал использовать сводную таблицу, если пользователь не может быть только в одной группе, с сводной таблицей должно работать что-то вроде этого:

Group::whereRaw('(SELECT COUNT(*) 
                  FROM groups_users 
                  WHERE group_id = group.id) < group.maximum_users')
    ->paginate(15);

С вашей текущей структурой

Group::whereRaw('(SELECT COUNT(*) 
                  FROM users 
                  WHERE group_id = groups.id) < groups.maximum_users')
    ->paginate(15);
...