0

I have a collection from a query called $dataItemregistrationdetail:

     $dataItemregistrationdetail = DB::table('itemregistrationdetail')
                                    ->join('sections', 'itemregistrationdetail.sectionid', '=', 'sections.sectionid')
                                    ->join('categories', 'itemregistrationdetail.categoryid', '=', 'categories.categoryid')
                                    ->join('kategori_kursus', 'itemregistrationdetail.kategoriid', '=', 'kategori_kursus.kategoriid')
                                    ->join('devices', 'itemregistrationdetail.deviceid', '=', 'devices.deviceid')
                                    ->select('itemregistrationdetail.*', 'sections.sectionname', 'categories.categoryname', 'kategori_kursus.kategorikursus', 'devices.kursusname')
                                    ->where('itemregistrationdetail.itemregistrationid', $id)
                                    ->get();

This collection output this:

 Collection {#557 ▼
 #items: array:4 [▼
  0 => {#552 ▼
  +"ItemRegistrationDetailID": 64852
  +"ItemRegistrationID": 194
  +"SectionID": 1
  +"CategoryID": 1
  +"KategoriID": 1
  +"DeviceID": 1129
  +"BrandID": 0
  +"ModelID": 0
  +"SerialNo": "SEKOLAH MENENGAH"
  +"StatusID": 1
  +"Imei": "MAKTAB PERGURUAN"
  +"No_tel": ""
  +"Comments": ""
  +"daymula_kursus": 9
  +"monthmula_kursus": "May"
  +"yearmula_kursus": 2011
  +"daytamat_kursus": 28
  +"monthtamat_kursus": "July"
  +"yeartamat_kursus": 2011
  +"sectionname": "I91"
  +"categoryname": "GURU BESAR"
  +"kategorikursus": "KURSUS (UMUM)"
  +"kursusname": "KURSUS ASAS"
  }
   1 => {#549 ▶}
   2 => {#555 ▶}
   3 => {#558 ▶}
 ]
}

I had another array for dates. The value of the array is the date for each element of $dataItemregistration. The date array named $datatarikhMula:

 $datatarikhMula = DB::table('itemregistrationdetail')
                  ->select('itemregistrationdetail.daymula_kursus', 'itemregistrationdetail.monthmula_kursus', 'itemregistrationdetail.yearmula_kursus')
                  ->where('itemregistrationdetail.itemregistrationid', $id)
                  ->get();

I had formatted the above collection to this array:

    //**************** format the value of the date************************  
    $dates = json_decode($datatarikhMula, true); 

    $dataTarikhMula = array();

    foreach($dates as $date)
    {
        $dataTarikhMula[] = implode(' ', array_values($date));
    }

The output for array dataTarikhMula is:

  array:4 [▼
  0 => "9 May 2011"
  1 => "24 0 2013"
  2 => "12 0 2013"
  3 => "7 April 2014"
  ]

I need to append each date to each dataItemregistrationdetail row so that in dataItemregistrationdetail will contain extra attribute named date containing the value from dataTarikhMula array. So, it will output like this:

   Collection {#557 ▼
 #items: array:4 [▼
  0 => {#552 ▼
  +"ItemRegistrationDetailID": 64852
  +"ItemRegistrationID": 194
  +"SectionID": 1
  +"CategoryID": 1
  +"KategoriID": 1
  +"DeviceID": 1129
  +"BrandID": 0
  +"ModelID": 0
  +"SerialNo": "SEKOLAH MENENGAH"
  +"StatusID": 1
  +"Imei": "MAKTAB PERGURUAN"
  +"No_tel": ""
  +"Comments": ""
  +"daymula_kursus": 9
  +"monthmula_kursus": "May"
  +"yearmula_kursus": 2011
  +"daytamat_kursus": 28
  +"monthtamat_kursus": "July"
  +"yeartamat_kursus": 2011
  +"sectionname": "I91"
  +"categoryname": "GURU BESAR"
  +"kategorikursus": "KURSUS (UMUM)"
  +"kursusname": "KURSUS ASAS"
  +"date": "9 May 2011"  <------------------added value
  }
   1 => {#549 ▶}
   2 => {#555 ▶}
   3 => {#558 ▶}
 ]
}

How to append the value into each $dataItemregistrationdetail array element?

I have edited the code to your suggested code:

$dataItemregistrationdetail->map(function ($detail) {
$detail['date'] = "{$detail->daymula_kursus} {$detail->monthmula_kursus} {$detail->yearmula_kursus}";
return $detail;

});

But the error appear as commented below.

1
  • error-> "Cannot use object of type stdClass as array" Commented Oct 26, 2018 at 3:37

1 Answer 1

1

You can add the new element for each collection item like so:

$dataItemregistrationdetail->map(function ($detail, $key) use ($dataTarikhMula) {
    $detail->date = $dataTarikhMula[$key] ?? null;
    return $detail;
});

Im not sure this is the best way for you though. You already have all the date data in the collection, why do you need a second query to build the date array. You could do this instead:

$dataItemregistrationdetail->map(function ($detail) {
    $detail->date = "{$detail->daymula_kursus} {$detail->monthmula_kursus} {$detail->yearmula_kursus}";
    return $detail;
});

this way you dont need the second array.

Sign up to request clarification or add additional context in comments.

5 Comments

it gives an error saying "Cannot use object of type stdClass as array"
Sorry for late repy..going out yesterday. I had edited the question mentioning part of the code that give the error.
so,sorry i had mistakenly edit wrong section. I had just edit the question with new code replacement.
I updated my answer, could you try again. The mistake was setting the property like $detail['date'] instead of $detail->date.
Thank you so much @Remul for your brilliant solution. You are right, don't have to implode it separately, just simplify it in an array map function. I have been trying for many days...

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.