Коллекция Laravel - Возвращает итог с помощью sum () для вложенных массивов - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь вернуть сумму, используя sum (), извлекая «продолжительность» от каждого пользователя в $ collection

Структура:

USER>CONTRACT_RESULTS> ДНИ> ДАТА> ДЕЯТЕЛЬНОСТЬ> ДЕЯТЕЛЬНОСТЬ

Я хочу запросить «тип» действия и вернуть время, связанное с этим действием.

У меня оно работало, когда оно былогораздо менее вложенный, используя:

$collection->whereIn('activity',['off'])->sum('duration'); 

Но я в растерянности, так как они так вложены, а имена массивов являются динамическими

Вот примерструктура для 1 пользователя в $ collection:

array:13 [▼
  "user_id" => 52
   "contract_results" => array:2 [▼
    "2019-10-21 - 2019-10-31" => array:10 [▼
      "hours_a_week" => "20"
      "days" => array:1 [▼
        "2019-10-21" => array:2 [▼
          "bank_holiday" => "no"
          "activities" => array:2 [▼
            "10:00 - 22:00" => array:5 [▼
              "type" => "driving"
              "from" => "10:00"
              "to" => "22:00"
              "duration" => 720
              "night_minutes" => 60
            ]
            "22:00 - 00:00" => array:5 [▼
              "type" => "driving"
              "from" => "22:00"
              "to" => "00:00"
              "duration" => 120
              "night_minutes" => 120
            ]
          ]
        ]
      ]
    ]
    "2019-11-01 - 2019-11-10" => array:10 [▼
      "hours_a_week" => "10"
      "days" => array:1 [▼
        "2019-11-01" => array:2 [▼
          "bank_holiday" => "yes"
          "activities" => array:1 [▼
            "10:00 - 22:00" => array:5 [▼
              "type" => "availability"
              "from" => "10:00"
              "to" => "22:00"
              "duration" => 720
              "night_minutes" => 60
            ]
          ]
        ]
      ]
    ]
  ]
]

Я новичок в этом, поэтому большое спасибо за ваш вклад!

1 Ответ

1 голос
/ 09 ноября 2019

Исходя из вашей unclear информации, это все, что я могу сделать:

$durationTotal = collect($data->get('contract_results'))
        ->transform(function ($contractResult) {
            return array_merge((array) $contractResult, [
                'days' => collect(data_get($contractResult, 'days'))
                    ->transform(function ($day) {
                        return array_merge((array) $day, [
                            'activities' => collect(data_get($day, 'activities'))
                                ->whereIn('type', ['driving'])
                                ->toArray()
                        ]);
                    })
                    ->toArray()
            ]);
        })
        ->sum(function ($item) {
            return array_sum(data_get($item, 'days.*.activities.*.duration', []));
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...