Laravel полиморфные отношения

139
30 января 2020, 10:40

Непростая задача, которую я не могу решить. Никак не пойму, как устроено все это.

Есть 3 таблицы: Users, Filials, Specs

Юзеры, филиалы и специальности.

Каждый юзер закреплен за филиалом, и у каждого юзера есть специальность.

Таблица Users
    `id`
    `name` - имена юзеров
    `filial_id` 
    `spec_id`

Из этого выходит, что я могу в конкретном филиале выбрать всех юзеров. В конкретной профессии всех юзеров . И также наоборот.

Но у всех профессий (таблица Specs) есть уровень доступа.

Таблица Specs
    `id`
    `name` - название профессии
    `lvl` - уровень доступа профессии

Так вот у меня идет цикл перечисления всех филиалов: выводится имя филиала и юзеры с уровнем 2.

Сейчас в моделе Filials я просто обращаюсь ко всем юзерам

public function users() {
        return $this->hasMany('App\User');
    }

Но мне нужны только уровня специальности 2. Назначать каждому юзеру свой уровень не годится, должен именно быть у профессии уровень. Как решить мне данную проблему без цикла в цикле? Я читал, что полиморфно как-то можно, но как я не пойму.

Answer 1

Во-первых, модели рекомендовано именовать в единственном числе: Filial, User, Spec. Далее, в модели User надо сделать следующее:

public function spec()
{
    return $this->belongsTo(Spec::class);
}

В модели Filial:

public function users()
{
    return $this->hasMany(User::class)->whereHas('spec', function($q){
        // Указываем с каким уровнем доступа выбирать
        $q->where('lvl', 2);
    });
}

UPD. Ссылки на соглашение об именовании: официальная документация, гитхаб

READ ALSO
Получить максимальное число из колонки

Получить максимальное число из колонки

Есть код для получения максимального числа из колонки num в БД

128
Таймер для опубликованной статьи на Symfony 2.8

Таймер для опубликованной статьи на Symfony 2.8

На сайте есть элемент в котором публикуется акция недели (только одна!),у данной статьи должен быть выставлен срок публикации по выбору , а так...

136
Как поделить на число переменную php?

Как поделить на число переменную php?

Почти никогда не сталкивался с php, а тут появилась задача вывести вторую цену товара поделённую на 12CMS Bitrix

159
Non-static method CSaleOrderChange::GetList()

Non-static method CSaleOrderChange::GetList()

После переноса сайта на новый сервер битрикс ругается:

125