Laravel中调用toArray()方法时如何禁用JSON字段的数组转换
解决Laravel集合
toArray()时禁用JSON字段自动转数组的问题 刚好遇到过类似的需求,给你几个可行的方案,根据你的场景选就行:
方案一:临时修改模型的Casts配置
如果只是针对单个或少量模型实例处理,可以临时移除对应字段的casts规则,转成数组后再恢复原有配置:
// 假设你的模型字段是`meta`,已经在$casts里设为'array' $model = YourModel::find(1); // 保存原始的casts配置 $originalCasts = $model->getCasts(); // 移除目标字段的casts规则 $model->setCasts(array_except($originalCasts, 'meta')); // 此时调用toArray(),meta字段会保持原始的JSON字符串 $modelArray = $model->toArray(); // 记得恢复原始casts,避免影响后续操作 $model->setCasts($originalCasts);
方案二:遍历集合替换原始值
如果是处理整个集合,可以遍历每个模型,先调用默认的toArray(),再把转成数组的字段替换回数据库里的原始JSON字符串:
$collection = YourModel::all(); $processedArray = $collection->map(function ($item) { $itemArray = $item->toArray(); // 用getOriginal()获取未经过casts转换的原始字段值 $itemArray['meta'] = $item->getOriginal('meta'); return $itemArray; })->toArray();
方案三:自定义模型的转数组方法
如果需要频繁用到这个功能,可以在模型里自定义一个方法,直接返回不经过JSON字段转换的数组:
// 在你的模型类中添加 public function toRawArray() { // attributesToArray()会返回模型的原始属性数组,不经过casts处理 return $this->attributesToArray(); }
之后在集合中使用就很方便:
$collection = YourModel::all(); $rawArray = $collection->map(fn($item) => $item->toRawArray())->toArray();
注意点
getOriginal()方法会返回字段在数据库中的原始值,即使你修改过模型实例的该字段值也不会受影响;如果需要获取修改后的JSON字符串(而非原始数据库值),可以用$item->attributes['meta']代替。- 方案三的
attributesToArray()不会包含关联关系的数组,如果需要包含关联,你需要自己在方法里补充关联的处理逻辑。
内容的提问来源于stack exchange,提问作者Jazz
相关产品推荐
相关产品推荐

