Консолидация / объединение строк данных с помощью Laravel Eloquent - PullRequest
0 голосов
/ 10 марта 2019

Я получаю данные из нескольких таблиц следующим образом:

$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 

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

enter image description here

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

1 Ответ

0 голосов
/ 11 марта 2019

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

В качестве sam sugested я использовал 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, в противном случае SEPARATOR не работал должным образом.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...