Консолидация/объединение строк данных с помощью laravel eloquent

Я извлекаю данные из таблиц Severl следующим образом:

$data = Accommodation::join("hotels", "accommodations.hotel_id", " = ", "hotels.id")
        ->join("room_types", "accommodations.room_type", " = ", "room_types.id")
        ->join("country", "accommodations.country_id", " = ", "country.id")
        ->join("accommodation_accreditation", "accommodations.id", " = ", "accommodation_accreditation.accommodation_id")
        ->join("accreditation", 'accreditation.id', " = ", "accommodation_accreditation.accreditation_id")
        ->select('hotels.name as Hotel' ,'room_types.type as Room', 'price_per_night as Price per Night', 'check_in as Check In', 'check_out as Check Out', 'nights as Nights', 'sub_total as Sub Total', 'country.name as Country', 'accreditation.full_name as Occupants')
        ->get()->toArray();

И я получаю ряд за каждого жильца в комнате.

          Room           Price per Night    Check In    Check Out    Nights   Sub Total   Country       Occupants      
 ---------------------- ----------------- ------------ ------------ -------- ----------- --------- ------------------- 
  Twin/Double standart               160   2019-04-10   2019-04-15        5         800   UKR       Vlad Timochenko  
  Twin/Double standart               160   2019-04-10   2019-04-15        5         800   UKR       Selena Viachenko  

Мне нужно соединить имена жильцов и поместить их в одну строку следующим образом:

          Room           Price per Night    Check In    Check Out    Nights   Sub Total   Country               Occupants               
 ---------------------- ----------------- ------------ ------------ -------- ----------- --------- ------------------------------------ 
  Twin/Double standart               160   2019-04-10   2019-04-15        5         800   UKR       Vlada Nikolchenko, Olena Diachenko 

Вот моя схема для рассматриваемых таблиц

Консолидация/объединение строк данных с помощью laravel eloquent

Надеюсь понятно. Будет здорово, если вы сможете помочь.

Для этого не требуются какие-либо специфические функции Laravel, вы можете использовать GROUP_CONCAT MySQL.

sam 10.03.2019 18:05

Почему люди боятся использовать отношения Eloquent? Есть ли какая-то конкретная причина, по которой вы не пошли с ним?

Benjamin Beganović 10.03.2019 20:42

@ Бенджамин Правда в том, что мне это не очень удобно, и мне нужно было закончить с этим быстрее, поэтому я решил использовать что-то более знакомое.

Vasko 11.03.2019 14:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
3
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Честно говоря, я нашел полное решение для своего случая в разных местах.

Как предложил Сэм, я использовал GROUP_CONCAT. И мой код выглядел так:

$data = Accommodation::join("hotels", "accommodations.hotel_id", " = ", "hotels.id")
        ->join("room_types", "accommodations.room_type", " = ", "room_types.id")
        ->join("country", "accommodations.country_id", " = ", "country.id")
        ->join("accommodation_accreditation", "accommodations.id", " = ", "accommodation_accreditation.accommodation_id")
        ->join("accreditation", 'accreditation.id', " = ", "accommodation_accreditation.accreditation_id")
        ->select('hotels.name as Hotel' ,'room_types.type as Room', 'price_per_night as Price per Night', 'check_in as Check In', 'check_out as Check Out', 'nights as Nights', 'sub_total as Sub Total', 'country.name as Country', DB:raw("GROUP_CONCAT('accreditation.full_name SEPRATOR ',') as `Occupants`"))
        ->groupBy('accommodation.id')
        ->get()->toArray();

Еще одна вещь, которую я должен был остерегаться, заключалась в использовании обратных кавычек для лейбла Occupants, иначе РАЗДЕЛИТЕЛЬ не работал должным образом.

Есть и другие подобные темы, так что это дубликат.

Group_concat — красноречивый laravelкак использовать GROUP_CONCAT в laravel

Другие вопросы по теме