0

0

Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】

穿越時空

穿越時空

发布时间:2025-12-30 12:41:02

|

206人浏览过

|

来源于php中文网

原创

laravel 的 $casts 中 'meta' => 'array' 不生效,是因为它仅对数据库原生 json 类型(如 mysql json、postgresql jsonb)自动序列化,对 text/varchar 字段无效;若字段非 json 类型,需迁移改为 json 类型,或改用 'object' 铸造、自定义 cast 类处理。

laravel怎么实现模型属性转换casting_laravel自动将json字段转为数组【技巧】

为什么 $casts 里写 'meta' => 'array' 有时不生效?

因为 Laravel 的 $castsarray 类型的处理依赖底层字段是否为 JSON 类型。如果数据库字段是 TEXTVARCHAR,即使写了 'meta' => 'array',Laravel 也不会自动 json_encode/json_decode——它只对原生 JSON 字段(如 MySQL 5.7+ 的 JSON 类型、PostgreSQL 的 jsonb)做隐式转换;对普通字符串字段,array cast 会被忽略,读出来仍是字符串。

  • 检查字段类型:
    DESCRIBE users;
    确认 meta 列是 JSON(MySQL)或 jsonb(PostgreSQL)
  • 如果不是,用迁移修正:
    Schema::table('users', function (Blueprint $table) {
        $table->json('meta')->nullable()->change();
    });
  • 若无法改字段类型(如旧项目用 TEXT 存 JSON 字符串),改用 'meta' => 'object' 或自定义 cast 类

cast'object''array' 有什么实际区别?

两者都要求字段内容是合法 JSON 字符串,但反序列化结果不同:array → PHP 关联数组(['name' => 'foo']),objectstdClass 实例(->name 可访问)。注意:Laravel 6+ 中 'array' 会强制转成「索引数组」,哪怕 JSON 是对象结构——这是常见误解点。

  • 想保留对象访问语法($user->meta->name)→ 用 'meta' => 'object'
  • 想用数组键语法($user->meta['name'])且 JSON 确实是对象 → 用 'meta' => 'array',但需确保 JSON 字符串开头是 {,不是 [
  • 若 JSON 是 [{"id":1}](数组结构),'array' 才能正确解析为 PHP 索引数组

怎么安全地存取嵌套 JSON 字段(比如 settings.theme.color)?

Laravel 原生不支持点号路径的自动映射,$casts 只作用于整字段。要操作子属性,得手动处理或借助访问器/修改器

  • 推荐方式:用访问器封装逻辑
    protected $casts = [
        'settings' => 'array'
    ];
    
    protected function getThemeAttribute()
    {
        return $this->settings['theme'] ?? [];
    }
    
    protected function setThemeAttribute($value)
    {
        $this->settings = array_merge($this->settings, ['theme' => $value]);
    }
  • 避免直接写 $user->settings['theme']['color'] = 'blue' 后漏掉 save() —— 数组赋值不会触发模型脏检测
  • 更健壮的做法:用 tap() + put() 链式更新
    tap($user, function ($u) {
        data_put($u->settings, 'theme.color', 'blue');
        $u->save();
    });

自定义 Cast 类比原生 array 多出什么能力?

当需要类型校验、默认值填充、或非标准序列化(比如存为压缩 JSON、加盐加密)时,必须写自定义 cast。原生 array 只做基础 json_decode / json_encode,无容错。

  • 例如:防止空字符串导致 json_decode('', true) 返回 null
    class SafeArrayCast implements CastsAttributes
    {
        public function get($model, string $key, $value, array $attributes)
        {
            return json_decode($value ?? '[]', true) ?: [];
        }
    
        public function set($model, string $key, $value, array $attributes)
        {
            return json_encode($value ?? [], JSON_UNESCAPED_UNICODE);
        }
    }
  • 在模型中使用:
    protected $casts = [
        'payload' => SafeArrayCast::class
    ];
  • 注意:自定义 cast 类必须实现 CastsAttributes 接口,且 get 方法返回值决定属性访问时的类型
Laravel 的 JSON casting 看似简单,真正踩坑的地方往往在字段类型匹配、空值处理、以及嵌套更新时的脏数据检测——这些细节不写日志很难复现,建议在测试中显式验证 is_array($model->attribute)isset($model->attribute['key'])

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

339

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

293

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

772

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

385

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

140

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

85

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

80

2025.08.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

451

2026.03.04

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 847人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号