迭代Eloquent查询返回的对象数组时修改单属性导致全部对象被更改
问题根因
- 本质是PHP对象引用传递的特性,叠加Laravel Eloquent的关联实例复用机制导致的:
- PHP中对象默认按引用传递,多个变量指向同一个内存中的对象实例时,修改任意一个变量对应的对象属性,所有引用该实例的变量都会同步更新
- Eloquent加载关联时默认会对相同主键的同类型模型做实例缓存:如果多个
fruit模型对应的nested_relationship关联模型主键相同,Eloquent不会为每个fruit生成独立的关联实例,而是让所有fruit的nested_relationship属性指向同一个实例,所以你修改其中一个的color属性,所有关联了该实例的fruit都会同步变化
- 你提供的示例代码本身存在语法问题,也可能导致非预期结果:
fruits数组初始化语法不合法,部分元素缺少闭合括号,字符串值也没有加引号
修复方法
如果需要修改单个对象的关联属性不影响其他对象,可以在修改前先对关联对象做深拷贝,生成独立实例:
foreach ($fruits as $fruit){ // 转数组再转回对象,得到和原对象数据一致的独立新实例 $clonedNested = (object) $fruit->nested_relationship->toArray(); if($fruit->name == 'apple'){ $clonedNested->color = 'red'; } elseif($fruit->name == 'grape') { $clonedNested->color = 'green'; } $fruit->nested_relationship = $clonedNested; }
内容的提问来源于stack exchange,提问作者Yeo Bryan
相关产品推荐
相关产品推荐

