间接修改 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
正在返回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'
];
【讨论】:
以上是关于间接修改 Illuminate\Support\Collection 的重载元素无效的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Nova Actions BelongsTo 字段不起作用