Случай 1
В случае, если у вас есть отношения, как показано на диаграмме ниже
Что вы ищетеэто отношение hasManyThrough
.
Из документации Laravel
Отношение «есть много через» обеспечивает удобный ярлык для доступа к удаленным отношениям черезпромежуточное отношение
В вашем случае для вашей модели User вы можете определить отношение
public function hotels()
{
return $this->hasManyThrough('App\Hotel', 'App\Account');
}
Чтобы затем получить свою коллекцию отелей, вы можете просто использовать
$hotels = Auth::user()->hotels;
Вы также можете предоставить дополнительные аргументы для функции hasManyThrough
, чтобы определить ключи, используемые в каждой таблице, отличные примеры этого приведены в документации, указанной выше!
Случай 2
Если вместо этого у вас есть отношение, как показано на следующей диаграмме
Это немного сложнее (или, по крайней мере,Менее чистый).Лучшее решение, которое я могу придумать, использующее наименьшее количество запросов, - это использовать with
.
$accounts = Auth::user()->accounts()->with('hotels')->get();
. Он предоставит вам набор учетных записей, каждый с дочерним элементом hotels
.Теперь все, что нам нужно сделать, это получить отели как отдельную коллекцию, это просто с некоторыми аккуратными функциями сбора, предоставляемыми Laravel.
$hotels = $accounts->flatMap(function($account) {
return $account->hotels;
})->unique(function ($hotel) {
return $hotel->id;
});
Это сделает работу по созданию коллекции отелей.На мой взгляд, было бы чище и эффективнее просто создать новые отношения, как показано ниже.
А затем выполнять запросы, используя базовые методы Eloquent.