You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 13:18:12