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

iq0todco  于 2022-12-05  发布在  其他
关注(0)|答案(5)|浏览(166)

我在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的重载元素不起作用
653,数组('查询' =〉对象(集合),'行' =〉数组('促销横幅标识' =〉1,'促销链接' =〉' http://localhost/deal/home/voucher ','关于促销' =〉'),'键' =〉0))
请指导我如何解决此问题
谢谢你(:

bybem2ql

bybem2ql1#

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;

});

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

93ze6v8z

93ze6v8z2#

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

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

jdzmm42g3#

问题是get返回stdObjectcollection
请修改所返回内容的模型,而不是将新字段添加到查询结果中。
因此,假设您的app目录中有一个PromotionBanner.php模型文件,编辑它,然后添加以下两个代码块:

protected $appends = array('promotionImage');

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

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属性
P.D:如果你没有使用模型...那么,只需创建文件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'
    ];
sg3maiej

sg3maiej4#

只是在需要在查询中传递数据时进行改进

$url = 'home/image/banner/';
$query = $query->map(function ($object) use ($url) {

    // Add the new property
    $object->promotion_image = URL::to( $url . $object->promotion_banner_id);

   // Return the new object
   return $object;
});
zzzyeukh

zzzyeukh5#

我整晚都在纠结这个问题,但我还是不知道我的问题出在哪里.
我已经使用->get()来实际执行查询,并且我已经在数据上尝试了->toArray()->jsonserialize(),但它没有解决问题。
最后,我找到的解决方法是:

$task = Tasks::where("user_id", $userId)->first()->toArray();
$task = json_decode(json_encode($task), true);
$task["foo"] = "bar";

使用json_encode,然后再次使用json_decode,将它从阻止我编辑它的任何东西中释放出来。
这充其量是一个笨拙的变通办法,但如果其他人只是需要克服这个问题,继续他们的工作,这可能会为您解决问题。

相关问题