Laravel attribute casting 导致的 Indirect modification of overloaded property

更新日期: 2018-10-10 阅读次数: 969 分类: Laravel

在 Laravel model 中,设置了某个属性做 array casting.

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

但是在 controller 中执行

array_push($record->rounds, date("Y-m-d H:i:s"));

时,报错

production.ERROR: Indirect modification of overloaded property

可见,casting 并不支持一些针对特定类型的操作,例如无法作为指定类型的函数的参数。

按照官方文档的做法,应该是先赋值给一个中间变量,进行操作,然后再赋值回去。

$user = App\User::find(1);
$options = $user->options;
$options['key'] = 'value';
$user->options = $options;
$user->save();

所以正确的做法应该是

$tmp = $record->rounds;
array_push($tmp, date("Y-m-d H:i:s"));
$record->rounds = $tmp;
$record->save();

collection casting

发现还有 collection casting 的支持,于是尝试了一下。

// casting 类型
-  'rounds' => 'array'
+  'rounds' => 'collection'

// collection 的 push 操作
// 需要注意,push 之后,需要重新赋值回去。
-  array_push($record->rounds, date("Y-m-d H:i:s"));
+ $record->rounds = $record->rounds->push(date("Y-m-d H:i:s"));

// 初始化
-  $game_record->rounds = [];
+ $game_record->rounds = collect([]);

casting 支持的类型

integer, real, float, double, string, boolean, object, array, collection, date, datetime, and timestamp.

爱评论不评论

近期节日

2019年02月24日 第三世界青年日
2019年02月28日 世界居住条件调查日
2019年03月01日 国际海豹日
2019年03月03日 全国爱耳日
2019年03月05日 学雷锋日
2019年03月06日 惊蛰
2019年03月08日 三八妇女节
2019年03月08日 龙抬头
2019年03月12日 植树节
2019年03月14日 白色情人节
2019年03月15日 消费者权益日
2019年03月17日 国际航海日
查看更多节日