Как в Laravel связать 4 модели?

Есть 4 взаимосвязанных таблицы:
- отели (hotels)
8Anok4bfz9X1zr.jpg
- группы удобств в отелях (hotels_amenity_groups)
KAxolZJfZGYnK2.jpg
- удобства в отелях (hotels_amenities)
L21zE7GFRNnGwA.jpg
- pivot-таблица, для связей удобства и отеля (hotels_amenity_hotel)
J2bVW0BS0eB4p2.jpg

Для всех таблиц в Laravel есть свои модели

Сейчас коллекцию отелей формирую так:
$hotels = Hotel::with('hotels_images')->take(20)->get();


Здесь нет никаких данных об удобствах в конкретном отеле. В конечном счёте хочу в эту коллекцию эти данные получить, чтобы по $hotel->amenities я бы мог получить массив с удобствами в этом отеле, причём где был бы не просто список удобств, а ещё и привязка к группам, к примеру вот так:

hotel
- name
- address
- rooms
--- room
--- room
--- room
- amenities
--- group
----- group_name
----- group_amenities
------- amenity
------- amenity
------- amenity

Как мне связать вышеуказанные модели, чтобы реализовать это?
  • Вопрос задан
  • 183 просмотра
Пригласить эксперта
Ответы на вопрос 1
dlnsk
@dlnsk
ПК Партнер 01.01 -> ПК Поиск -> IBM PC
Вам не кажется, что вы пытаетесь изобрести один запрос для решения нескольких совершенно разных задач? Вряд ли это положительно отразится на скорости работы приложения.
1. Когда вы отображаете список отелей, то вряд ли вам нужен полный список удобств, да еще сгруппированный... Просто где вы их собираетесь отображать? Может достаточно кол-ва или каких-то важных, заведомо выбранных удобств (бесплатная парковка, например)?
2. Когда вы будете искать отели по критериям, то там будет совершенно другой запрос.
3. Все эти удобства нужны только при отображении одного отеля. Так почему не сделать несколько запросов?
$amenities = $hotel->amenities()->with('groups')->get();
а потом с помощью методов Collection сгруппировать их так, как вашей душе угодно.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы