Слияние ценностей Коллекции в Laravel - PullRequest
1 голос
/ 25 сентября 2019

Я задумался над этой проблемой.Я до сих пор пробовал читать, искать и пробовать документацию Коллекций, но мне не повезло с тем, что я пытаюсь сделать.

То, чего я пытаюсь добиться, - это объединить все продукты по «product_id», сложить «qty» и получить массив «ответственных» за один и тот же продукт в одну новую коллекцию:

У меня есть следующая информация из моей базы данных:

[
   {
      "qty":"8",
      "product_id":6,
      "product":{
         "id":6,
         "name":"Mantequilla",
         "barcode":"123456789",
         "full_name":"Mantequilla - 123456789"
      },
      "itbis":"0",
      "precio":"0",
      "responsible":"Juan"
   },
   {
      "qty":"4",
      "product_id":6,
      "product":{
         "id":6,
         "name":"Mantequilla",
         "barcode":"123456789",
         "full_name":"Mantequilla - 123456789"
      },
      "itbis":"0",
      "precio":"0",
      "responsible":"Carlos"
   },
   {
      "qty":"3",
      "product_id":8,
      "product":{
         "id":8,
         "name":"Papas",
         "barcode":"4567894456",
         "full_name":"Papas - 4567894456"
      },
      "itbis":"0",
      "precio":"0",
      "responsible":"Pedro"
   }
]

Затем будет преобразовано в это:

[
   {
      "qty":"12",
      "product_id":6,
      "product":{
         "id":6,
         "name":"Mantequilla",
         "barcode":"123456789",
         "full_name":"Mantequilla - 123456789"
      },
      "itbis":"0",
      "precio":"0",
      "responsible": ["Juan", "Carlos"]
   }
   {
      "qty":"3",
      "product_id":8,
      "product":{
         "id":8,
         "name":"Papas",
         "barcode":"4567894456",
         "full_name":"Papas - 4567894456"
      },
      "itbis":"0",
      "precio":"0",
      "responsible":"Pedro"
   }
]

1 Ответ

0 голосов
/ 25 сентября 2019
        $arr = [...]; // Your input array

        $res = collect($arr)
            ->groupBy('product_id')
            ->map(function ($sub_collection) {
                $first = $sub_collection->first();

                $first['qty']         = array_sum(array_column($sub_collection->toArray(), 'qty'));
                $first['responsible'] = array_merge(array_column($sub_collection->toArray(), 'responsible'));

                return $first;
            })
            ->toArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...