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

Posted

技术标签:

【中文标题】间接修改 Illuminate\\Support\\Collection 的重载元素无效【英文标题】:Indirect modification of overloaded element of Illuminate\Support\Collection has no effect间接修改 Illuminate\Support\Collection 的重载元素无效 【发布时间】:2017-11-16 06:55:22 【问题描述】:

我是 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, array('query' => object(Collection), 'row' => array('promotion_banner_id' => 1, 'promotion_link' => 'http://localhost/deal/home/voucher', 'about_promotion' => '') , '键' => 0))

请指导我如何解决这个问题

谢谢你(:

【问题讨论】:

那么,你想更新对象吗?或者您想在查询中添加另一个过滤器?还是要插入新行? 添加新键和新值@Jerodev 【参考方案1】:

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

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

【讨论】:

【参考方案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;

);

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

【讨论】:

【参考方案3】:

问题是get 正在返回collectionstdObject

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

因此,假设您的 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'
    ];

【讨论】:

以上是关于间接修改 Illuminate\Support\Collection 的重载元素无效的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Nova Actions BelongsTo 字段不起作用

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

教义,编辑 ManyToMany - 重载属性的间接修改

错误异常:间接修改重载属性 laravel

间接修改CHttpSession的重载元素没有效果

只读访问执行 SP/get 结果集的角色,无需间接修改 db?