Вопрос Laravel по отношениям

Есть 3 модели Region, Branch, User и одна сводная таблица user_branches в ней поля user_id и branch_id

У региона есть филиалы там отношения

public function branches(){
    return $this->hasMany(Branch::class);
}

У филиала есть отношение

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

Как мне вернуть все регионы которые есть в базе с филиалами, но только те филиалы которые доступны залогиненному юзеру

Получаю так все регионы и филиалы в них Region::with('branches')->get();, вот тут получается нужно отсортировать только те филиалы которые доступны юзеру


Ответы (1 шт):

Автор решения: IndianCoding

Вы можете использовать query builder внутри with. В данном случае нужна комбинация with() + whereHas().

Получить все регионы с отфильтрованными филиалами:

$regions = Region
    ::with([
        'branches' => function ($query) {
            $query->whereHas('users', function ($query) {
                $query->where('id', auth()->id());
            });
        }
    ])
    ->get();

Получить только те регионы, в которых есть отфильтрованные филиалы, с отфильтрованными филиалами:

$regions = Region
    ::with([
        'branches' => function ($query) {
            $query->whereHas('users', function ($query) {
                $query->where('id', auth()->id());
            });
        }
    ])
    ->whereHas('branches', function ($query) {
        $query->whereHas('users', function ($query) {
            $query->where('id', auth()->id());
        });
    })
    ->get();

Если база данных пожалуется на колонку id, тогда надо заменить id на users.id:

$query->where('users.id', auth()->id());
→ Ссылка