Laravel 8集合调用transform无法修改模型原有属性但可新增属性如何解决
问题根源
这个问题是Laravel Eloquent模型的属性赋值规则导致的,核心原因有两类:
- 你要修改的
liked_by_me是数据库存在的字段,直接赋值会触发模型定义的访问器/修改器逻辑,如果访问器/修改器配置错误,就会出现赋值不生效的情况;而新增的newAttr是临时属性,不会触发模型的字段校验逻辑,所以可以正常赋值。 - 原代码使用PHP弱类型比较
==判断null,会把0、空字符串、false等合法值误判为null,导致赋值逻辑不符合预期。
解决方案
写法修正
改用setAttribute方法赋值已有数据库字段,同时用强类型比较规避歧义:
$commentList->transform(function($item, $key) { // 强类型判断原始值是否为null,直接从属性数组取值绕过访问器 $originIsNull = $item->getRawOriginal('liked_by_me') === null; // 用setAttribute修改已有字段,确保值正确写入属性数组 $item->setAttribute('liked_by_me', $originIsNull ? false : true); // 新增临时属性直接赋值即可 $item->newAttr = $originIsNull ? false : true; return $item; });
额外排查项
如果修改后还是不生效,按顺序检查Comment模型的配置:
- 有没有定义
getLikedByMeAttribute访问器:如果有,序列化输出时会优先返回访问器的结果,覆盖你赋值的内容,可以删除访问器,或者修改访问器逻辑适配你的需求 - 有没有定义
setLikedByMeAttribute修改器:确认修改器里正确给$this->attributes['liked_by_me']赋值,没有额外的逻辑拦截赋值 - 有没有把
liked_by_me加入$hidden数组:如果是序列化输出看不到修改后的值,检查是否被隐藏
其他遍历方法注意事项
- 使用
each方法时不需要返回值,直接修改$item即可,操作的是原集合内的对象 - 使用
map方法时需要用变量接收返回的新集合,原集合不会被修改
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

