2

我有一个模型有一个属性被转换为数组,就像这样

protected $casts = [
   'data' => 'array',
];

在返回 Collection 之前,我需要对数组进行修改。使用eachCollection 上的方法,我可以更改里面的属性。

$collection = $collection->each(function ($collection, $key) {
    if ($collection->type == 'foo') {
       $collection->type = 'bar';
    }
});

这有效,并且集合被更改。但是我需要更改 cast 属性中的数组。

$collection = $collection->each(function ($collection, $key) {
    if ($collection->type == 'foo') {

        foreach ($collection->data['x'] as $k => $v) {
            $collection->data['x'][$k]['string'] = 'example';
        }

    }
});

但是,这会返回错误。

Indirect modification of overloaded property App\Models\Block::$data has no effect

我知道访问 $collection->data 将使用魔术 __get()正在使用,所以我需要使用 setter。那么我该如何实现呢?

提前致谢。

4

1 回答 1

1

大概您可以获取整个数组,执行修改然后设置它:

$collection = $collection->each(function ($collectionItem, $key) {
    if ($collectionItem->type == 'foo') {
        $data = $collectionItem->data;
        foreach ($data['x'] as $k => $v) {
            $data['x'][$k]['string'] = 'example';
        }
        $collectionItem->data = $data;

    }
});

尽管如果模型的所有用途都需要此修改,那么在模型自身中执行此操作可能会更好:

class SomeModel
{


    //protected $casts = [
    //   'data' => 'array',
    //];

    public function getDataAttribute($value)
    {
        $data = json_decode($value);
        foreach ($data['x'] as $k => $v) {
                $data['x'][$k]['string'] = 'example';
        }
        return $data;
    }

    public function setDataAttribute($value)
    {
        $this->attributes['data'] = json_encode($value);
    }

}
于 2016-05-25T11:38:49.670 回答