【问题标题】: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

标签: database laravel


【解决方案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'
          ];
      

      【讨论】:

        猜你喜欢
        • 2021-08-18
        • 1970-01-01
        • 2013-12-01
        • 2023-04-08
        • 2015-03-07
        • 2013-10-19
        • 1970-01-01
        • 2019-11-01
        • 1970-01-01
        相关资源
        最近更新 更多