间接修改Illuminate \ Support \ Collection的重载元素无效

时间:2017-06-14 08:26:56

标签: database laravel

我在laravel框架中非常新,而且我来自codeigniter。

我想从数据库中添加新的密钥和值

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;
}

该代码刚刚从codeigniter更改为laravel,因为在codeigniter中传递foreach语句中的新键和值没有问题

但是当我在laravel中尝试它时,我得到以下错误:

  

间接修改Illuminate\Support\Collection的重载元素无效

     

at HandleExceptions-> handleError(8,'间接修改Illuminate \ Support \ Collection的重载元素无效',' C:\ xampp \ htdocs \ laravel-site \ application \ app \ models \ main \ Main_home_m.php',653,数组('查询' =>对象(收藏),'行' =>数组(&#39 ; promotion_banner_id' => 1,' promotion_link' =>' http://localhost/deal/home/voucher',' about_promotion' =>' '),' key' => 0))

请指导我如何解决此问题

谢谢(

3 个答案:

答案 0 :(得分:2)

Laravel查询的结果始终为a Collection。要向此集合中的所有对象添加属性,可以使用map函数。

$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;

});

此外,您可以使用实际对象属性而不是数组键来获取和设置属性。这使得代码在我看来更具可读性。

答案 1 :(得分:0)

问题是get正在返回collection stdObject

不是将新字段添加到查询结果中,而是修改要返回的模型。

因此,假设您在app目录中有一个PromotionBanner.php模型文件,请对其进行编辑,然后添加这两个代码块:

protected $appends = array('promotionImage');

这里你刚刚添加了自定义字段。现在你告诉模型如何填充它:

public function getPromotionImageAttribute() {
    return (url('home/image/banner/'.$this->promotion_banner_id)); 
}

现在,您可以通过模型获得横幅广告:

static function m_get_promotion_banner(){
    return \App\PromotionBanner::where('promotion_active','1')->get();
}

现在,您可以在结果中访问promotionImage个名

Pd积: 在你没有使用模型的情况下......好吧,只需创建文件app \ PromotionImage.php:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;


class PromotionImage extends Model
{
    protected $appends = array('imageAttribute');
    protected $table = 'promotion_banner';    

    public function getPromotionImageAttribute() {
        return (url('home/image/banner/'.$this->promotion_banner_id)); 
    }

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'promotion_banner_id','promotion_link','about_promotion','promotion_active'
    ];

答案 2 :(得分:0)

对于需要解决方案的其他人,您可以使用 jsonserialize 方法来修改集合。 如:

$data = $data->jsonserialize();
//do your changes here now.