Laravel перечисляет и суммирует результаты в нескольких циклах в одной таблице

#mysql #laravel #laravel-blade

Вопрос:

Мне нужно объединить данные в одну таблицу с вложенным циклом и сначала перечислить страны, а затем собрать точки каждой службы, чтобы сгруппировать города и службы городов.

Мой стол : Услуги

 CREATE TABLE `Service` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `country` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `city` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `services` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `point` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `items` (`id`, `country`, `city`, `services`, `point`, `status`) VALUES
('8', 'ABD', 'TEXAS', 'Food', '20', 'active'),
('9', 'ABD', 'TEXAS', 'Food', '40', 'active'),
('10', 'ABD', 'MONTANA', 'Hotel', '10', 'active'),
('11', 'ABD', 'MONTANA', 'Food', '70', 'active'),
('12', 'ABD', 'MONTANA', 'Hotel', '20', 'active'),
('13', 'ABD', 'TEXAS', 'Shopping', '80', 'active'),
('14', 'ITALY', 'ROMA', 'Shopping', '20', 'active'),
('15', 'ITALY', 'ROMA', 'Hotel', '90', 'active'),
('16', 'ITALY', 'LAZIO', 'Shopping', '80', 'active'),
('17', 'TURKEY', 'ANTALYA', 'Hotel', '10', 'active'),
('18', 'TURKEY', 'ISTANBUL', 'Shopping', '100', 'active'),
('19', 'TURKEY', 'ISTANBUL', 'Hotel', '50', 'active'),
('20', 'TURKEY', 'ISTANBUL', 'Hotel', '90', 'active');
 

введите описание изображения здесь

Результат, который я хочу получить
введите описание изображения здесь

Заранее спасибо за вашу помощь

Ответ №1:

Вы можете сгруппировать страну и город с помощью коллекции

 $service= AppModelsService::get()->groupBy(['country','city']);
 

Обновленный

 $service= AppModelsService::get()->groupBy(['country','city','services'])->map(function ($city) {

     return $city->map(function ($services) {

          return $services->map(function ($service) {

                return $service->sum('point');

            });

        });
       
    });
 

Обновленный

 $service= AppModelsService::get()->groupBy(['country','city','services'])->map(function ($city) {
    
         return $city->map(function ($services) {
    
              return $services->map(function ($service) {

                    return ['serviceName'=>$service->first()->services,'sum'=>$service->sum('point'),"count"=>$service->count()];

                });

            });
           
        });
 

Комментарии:

1. Я разделяюсь на группы таким же образом, но я не получаю итоговые баллы за каждый балл. яйцо: италия->рома->>выкидывание: 110. Большое вам спасибо за ваш ответ

2. @YunusKocabay действительно не уверен в этом, но, возможно, вы задавали много вопросов за один день или что-то еще

3. meta.stackexchange.com/questions/273741/…

4. @YunusKocabay .на базовую идею уже ответил, так что сначала попробуйте сами .если у меня будет время, я проверю

5. единственное, что вы можете сделать, это вернуться [‘serviceName’=>$service->>first()->>>services,’sum’=>>>>$service->>>>>sum(‘point’),»count»=>>>>>>$service->>>>>>>count()];