Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Indirect modification of overloaded element of Illuminate\Support\Collection has no effect

im quite new in laravel framework, and im from codeigniter.

I would like to add new key and value from database

static function m_get_promotion_banner(){
    $query = DB::table("promotion_banner")
        ->select('promotion_banner_id','promotion_link','about_promotion')
        ->where('promotion_active','1')
        ->get();
    if($query != null){
        foreach ($query as $key => $row){
            $query[$key]['promotion_image'] = URL::to('home/image/banner/'.$row['promotion_banner_id']);
        }
    }
    return $query;
}

that code was just changed from codeigniter to laravel, since in codeigniter there are no problem in passing a new key and value in foreach statement

but when i tried it in laravel i got this following error :

Indirect modification of overloaded element of Illuminate\Support\Collection has no effect

at HandleExceptions->handleError(8, 'Indirect modification of overloaded element of Illuminate\Support\Collection has no effect', 'C:\xampp\htdocs\laravel-site\application\app\models\main\Main_home_m.php', 653, array('query' => object(Collection), 'row' => array('promotion_banner_id' => 1, 'promotion_link' => 'http://localhost/deal/home/voucher', 'about_promotion' => ''), 'key' => 0))

please guide me how to fix this

thank you (:

like image 598
Kelvin Avatar asked Jun 14 '17 08:06

Kelvin


2 Answers

The result of a Laravel query will always be a Collection. To add a property to all the objects in this collection, you can use the map function.

$query = $query->map(function ($object) {

    // Add the new property
    $object->promotion_image = URL::to('home/image/banner/' . $object->promotion_banner_id);

    // Return the new object
    return $object;

});

Also, you can get and set the properties using actual object properties and not array keys. This makes the code much more readable in my opinion.

like image 116
Jerodev Avatar answered Dec 08 '22 00:12

Jerodev


For others who needs a solution you can use jsonserialize method to modify the collection. Such as:

$data = $data->jsonserialize();
//do your changes here now.
like image 31
Alican Ali Avatar answered Dec 08 '22 00:12

Alican Ali