Непростая задача, которую я не могу решить. Никак не пойму, как устроено все это.
Есть 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. Назначать каждому юзеру свой уровень не годится, должен именно быть у профессии уровень. Как решить мне данную проблему без цикла в цикле? Я читал, что полиморфно как-то можно, но как я не пойму.
Во-первых, модели рекомендовано именовать в единственном числе: 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. Ссылки на соглашение об именовании: официальная документация, гитхаб
Продвижение своими сайтами как стратегия роста и независимости