我在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))
请指导我如何解决此问题
谢谢(答案 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.