Laravel Eloquent对象值无法修改?修改后需保存吗?
Laravel Eloquent属性修改后不生效问题解答
问题重现
遍历关联模型时修改quantity属性,赋值后输出仍为原始值:
foreach($orders as $order){ foreach($order->order_products as $order_product){ foreach($order_product->order_product_options as $order_product_option){ echo $order_product_option->quantity; // 输出10 $order_product_option->quantity = 20; echo $order_product_option->quantity; // 还是输出10! $some_array['quantity'] = $order_product_option->quantity; } } }
原因分析
1. 模型访问器干扰
如果OrderProductOption模型中定义了getQuantityAttribute访问器,且逻辑强制返回数据库原始值,会覆盖内存中的修改。比如:
// 错误示例 public function getQuantityAttribute($value) { // 强制返回数据库原始值,忽略内存修改 return $this->original['quantity']; }
2. 类型转换配置错误
若quantity字段在模型$casts中设置了不匹配的类型,赋值时可能无法正确写入模型属性数组。比如将数值类型强制转为字符串,但赋值用了整数类型,导致属性未更新。
3. 模型实例缓存问题
极少数情况下,关联加载的模型实例存在缓存,导致直接赋值无法覆盖原始属性值。
解决方法
修正访问器逻辑:确保访问器返回当前模型的属性值,而非强制返回原始数据库值:
// 正确示例 public function getQuantityAttribute($value) { // 仅对值做类型转换等必要处理 return (int)$value; }直接操作属性数组(调试用):若访问器无法修改,可直接赋值到模型的
$attributes数组(不推荐常规使用):$order_product_option->attributes['quantity'] = 20; echo $order_product_option->quantity; // 此时输出20验证类型转换:检查
OrderProductOption模型的$casts配置,确保quantity类型与赋值类型匹配:protected $casts = [ 'quantity' => 'integer', // 确保类型正确 ];
关于保存的说明
- 若仅在当前请求内存中使用修改后的值,无需保存,赋值生效后直接使用即可;
- 若要将修改同步到数据库,必须调用
save()或update()方法:$order_product_option->quantity = 20; $order_product_option->save(); // 同步到数据库
内容的提问来源于stack exchange,提问作者ronrun
相关产品推荐
相关产品推荐

