@Yariy

Laravel как создать связь через несколько таблиц?

Суть такая, есть таблица пользователей и таблица филиалов. Связь много-ко-многим (belongsToMany)

Есть таблица Склад, она относится к филиалу, как много-к-одному (belongsTo)
И есть таблица Тарифы, она относится к складу, как много-к-одному (belongsTo)

Филиалы, к которым привязан пользователь, я могу получить как
Auth::user()->branches()->get()
А как мне получить склады, которые относятся к филиалам, к которым есть доступ у пользователя?
И еще заковыристей: как получить тарифы, которые относятся к складам, которые относятся к филиалам, к которым есть доступ у пользователя?
  • Вопрос задан
  • 882 просмотра
Пригласить эксперта
Ответы на вопрос 2
@jazzus
HasMany Through
user hasMany warehouses through branches with prices
получать через $user->warehouses прайсы внутри

Или через вложенные отношения в филиалах
$user->branches()
    ->with('warehouses.prices')
    ->get();

Здесь нужно будет форычить branches и в каждом будет $branch->warehouses и по цепочке.

Или запросом на складах
Warehouse::whereHas('branche', function ($query) {
    $query->where('user_id', Auth::id());
})
->get();

прайсы аналогично
Ответ написан
Комментировать
@Yariy Автор вопроса
Решил в итоге не мудрить сильно, т.к. время очень ограничено, запилил в модель пользователя функции, которые через join'ы вытаскивают id всех сущностей, связанных с пользователями через несколько таблиц

public function stores(){
        return Store::join('branches', 'stores.branch_id', '=', 'branches.id')->
            join('user_branches', 'branches.id', '=', 'user_branches.branch_id')->
            join('users', 'user_branches.user_id', '=', 'users.id')->
            select('stores.id as id')->
            where('users.id', $this->id);
    }

    public function rates(){
        return Rate::join('stores', 'rates.store_id', '=', 'stores.id')->
        join('branches', 'stores.branch_id', '=', 'branches.id')->
        join('user_branches', 'branches.id', '=', 'user_branches.branch_id')->
        join('users', 'user_branches.user_id', '=', 'users.id')->
        select('rates.id as id')->
        where('users.id', $this->id);
    }


и добаивл фильтр по id

->whereIn('id', Auth::user()->rates()->pluck('id'))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
18 апр. 2024, в 07:58
500 руб./в час
18 апр. 2024, в 07:22
45000 руб./за проект
18 апр. 2024, в 01:12
150000 руб./за проект