Home > Back-end >  how to merge two collection when value is same in laravel
how to merge two collection when value is same in laravel

Time:01-25

I have following data which I want to merge when it repeats:

{
    "employee_id": 7,
    "organization_id": 1,
    "year": 2021,
    "tenure_id": 1,
    "leave_name": "Annual Leaves",
    "leaves": 26,
    "lates": "1",
    "leave_id": 1,
    "assigned_quota": 99,
    "available_quota": "12",
    "is_default_leave": 1,
    "exceeding": 14
},
{
    "employee_id": 15,
    "organization_id": 1,
    "year": 2021,
    "tenure_id": 1,
    "leave_name": "test",
    "leaves": "25",
    "lates": "0",
    "leave_id": 16,
    "assigned_quota": 50,
    "available_quota": "4",
    "is_default_leave": 0,
    "exceeding": 21
},
{
    "employee_id": 15,
    "organization_id": 1,
    "year": 2021,
    "tenure_id": 1,
    "leave_name": "Annual Leaves",
    "leaves": 25,
    "lates": "0",
    "leave_id": 1,
    "assigned_quota": 99,
    "available_quota": "9",
    "is_default_leave": 1,
    "exceeding": 16
}

know I want it to like this when it merge:

{
                "employee_id": 15,
                "organization_id": 1,
                "year": 2021,
                "tenure_id": 1,
                "leaves": [
                    {
                        "leave_name": "Annual Leaves",
                        "leaves": 25,
                        "lates": "0",
                        "leave_id": 1,
                        "assigned_quota": 99,
                        "available_quota": "9",
                        "is_default_leave": 1,
                        "exceeding": 16
                    },
                    {
                        "leave_name": "test",
                        "leaves": "25",
                        "lates": "0",
                        "leave_id": 16,
                        "assigned_quota": 50,
                        "available_quota": "4",
                        "is_default_leave": 0,
                        "exceeding": 21
                    }
                ]
            }

I have tried using groupby with "employee_id" however it but it gives data with id as parent and and array inside which I dont want anyone here please explain how can I achieve this.

CodePudding user response:

merge method returns merged collection

$c1 = new Collection(['foo']);
$c2 = new Collection(['bar']);

$merged = $c1->merge($c2); // Contains foo and bar.



$c1 = CollectionA::all();
$c2 = CollectionB::all();

$merged = $c1->merge($c2);

CodePudding user response:

Not sure the builting collection methods will do that for you, but some simple PHP code will

$jstring = '[{
    "employee_id": 7, "organization_id": 1, "year": 2021,
    "tenure_id": 1, "leave_name": "Annual Leaves", "leaves": 26,
    "lates": "1", "leave_id": 1, "assigned_quota": 99,
    "available_quota": "12", "is_default_leave": 1, "exceeding": 14
},
{
    "employee_id": 15, "organization_id": 1, "year": 2021,
    "tenure_id": 1, "leave_name": "test", "leaves": "25",
    "lates": "0", "leave_id": 16, "assigned_quota": 50,
    "available_quota": "4", "is_default_leave": 0, "exceeding": 21
},
{
    "employee_id": 15, "organization_id": 1, "year": 2021,
    "tenure_id": 1, "leave_name": "Annual Leaves", "leaves": 25,
    "lates": "0", "leave_id": 1, "assigned_quota": 99,
    "available_quota": "9", "is_default_leave": 1, "exceeding": 16
}]';

$json = json_decode($jstring);
$merged = [];
foreach ($json as $jobj){
    if ( array_key_exists($jobj->employee_id, $merged) ) {
        // we saw this one before so add to the employee's leaves array
        $merged[$jobj->employee_id]->leaves[] = [   "leave_name"        => $jobj->leave_name,
                                                    "leaves"            => $jobj->leaves,
                                                    "lates"             => $jobj->lates,
                                                    "leave_id"          => $jobj->leave_id,
                                                    "assigned_quota"    => $jobj->assigned_quota,
                                                    "available_quota"   => $jobj->available_quota,
                                                    "is_default_leave"  => $jobj->is_default_leave,
                                                    "exceeding"         => $jobj->exceeding
                                                ];
    } else {
        $leaves = [ "leave_name"        => $jobj->leave_name,
                    "leaves"            => $jobj->leaves,
                    "lates"             => $jobj->lates,
                    "leave_id"          => $jobj->leave_id,
                    "assigned_quota"    => $jobj->assigned_quota,
                    "available_quota"   => $jobj->available_quota,
                    "is_default_leave"  => $jobj->is_default_leave,
                    "exceeding"         => $jobj->exceeding
                ];
        $obj = new stdClass;
        $obj->employee_id       = $jobj->employee_id;
        $obj->organization_id   = $jobj->organization_id;
        $obj->year              = $jobj->year;
        $obj->tenure_id         = $jobj->tenure_id;
        $obj->leaves[]          = $leaves;

        $merged[$jobj->employee_id] = $obj;

    }
}
print_r($merged);

RESULTS

Array (
    [7] => stdClass Object  (
            [employee_id] => 7
            [organization_id] => 1
            [year] => 2021
            [tenure_id] => 1
            [leaves] => Array  (
                    [0] => Array  (
                            [leave_name] => Annual Leaves
                            [leaves] => 26
                            [lates] => 1
                            [leave_id] => 1
                            [assigned_quota] => 99
                            [available_quota] => 12
                            [is_default_leave] => 1
                            [exceeding] => 14
                        )
                }
        )
    [15] => stdClass Object (
            [employee_id] => 15
            [organization_id] => 1
            [year] => 2021
            [tenure_id] => 1
            [leaves] => Array (
                    [0] => Array {
                            [leave_name] => test
                            [leaves] => 25
                            [lates] => 0
                            [leave_id] => 16
                            [assigned_quota] => 50
                            [available_quota] => 4
                            [is_default_leave] => 0
                            [exceeding] => 21
                        )
                    [1] => Array (
                            [leave_name] => Annual Leaves
                            [leaves] => 25
                            [lates] => 0
                            [leave_id] => 1
                            [assigned_quota] => 99
                            [available_quota] => 9
                            [is_default_leave] => 1
                            [exceeding] => 16
                        )
                )
        )
)
  •  Tags:  
  • Related