Search code examples
laraveldatatableslaravel-collection

How to merge laravel collection if key values are same? or add new row of data


i have two collections,like..

date         sum_total count_total
2020-05-10      10         5
2020-05-11      11         6
2020-05-13      5          7

second collection

date1         sum_total1   count_total2
2020-05-10      1              5
2020-05-12      2              4
2020-05-13      0              7

I need output like...

date         sum_total count_total
2020-05-10      11         10
2020-05-11      11         6
2020-05-12      2          4
2020-05-13      5          14

I need to arrange data according to date.


Solution

  • Assuming the collections are like these;

    public function index()
    {
        $first = collect([
            [
                'date' => '2020-05-10',
                'sum_total' => 10,
                'count_total' => 5,
            ],
            [
                'date' => '2020-05-11',
                'sum_total' => 11,
                'count_total' => 6,
            ],
            [
                'date' => '2020-05-13',
                'sum_total' => 5,
                'count_total' => 7,
            ]
        ]);
    
        $second = collect([
            [
                'date' => '2020-05-10',
                'sum_total' => 1,
                'count_total' => 5,
            ],
            [
                'date' => '2020-05-12',
                'sum_total' => 2,
                'count_total' => 4,
            ],
            [
                'date' => '2020-05-13',
                'sum_total' => 0,
                'count_total' => 7,
            ]
        ]);
    
        return $first->merge($second)
            ->groupBy('date')
            ->map(function ($sub) {
                return [
                    'date' => $sub->first()['date'],
                    'sum_total' => $sub->sum('sum_total'),
                    'count_total' => $sub->sum('count_total'),
                ];
            })
            ->sortBy('date')
            ->values();
    }
    

    It prints;

    [
      {
        "date": "2020-05-10",
        "sum_total": 11,
        "count_total": 10
      },
      {
        "date": "2020-05-11",
        "sum_total": 11,
        "count_total": 6
      },
      {
        "date": "2020-05-12",
        "sum_total": 2,
        "count_total": 4
      },
      {
        "date": "2020-05-13",
        "sum_total": 5,
        "count_total": 14
      }
    ]