Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
发布时间 - 2025-12-30 00:00:00 点击率:次Laravel 的 $casts 中 'meta' => 'array' 不生效,是因为它仅对数据库原生 JSON 类型(如 MySQL JSON、PostgreSQL jsonb)自动序列化,对 TEXT/VARCHAR字段无效;若字段非 JSON 类型,需迁移改为 json 类型,或改用 'object' 铸造、自定义 Cast 类处理。
为什么 $casts 里写 'meta' => 'array' 有时不生效?
因为 Laravel 的 $casts 对 array 类型的处理依赖底层字段是否为 JSON 类型。如果数据库字段是 TEXT 或 VARCHAR,即使写了 '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']),object → stdClass 实例(->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)返回nullclass 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方法返回值决定属性访问时的类型
is_array($model->attribute) 和 isset($model->attribute['key'])。
# mysql
# php
# laravel
# js
# json
# 区别
# 修改器
# 隐式转换
# 为什么
# Array
# Object
# NULL
# 关联数组
# 封装
# 字符串
# 接口
# Attribute
# 访问器
# 对象
# postgresql
# 数据库
# 自定义
# 链式
# 序列化
# 这是
# 有什么
# 很难
# 仍是
# 写了
# 如果不是
# 不支持
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
C++时间戳转换成日期时间的步骤和示例代码
原生JS实现图片轮播切换效果
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
在centOS 7安装mysql 5.7的详细教程
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
如何快速生成橙子建站落地页链接?
中山网站推广排名,中山信息港登录入口?
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
微信小程序制作网站有哪些,微信小程序需要做网站吗?
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
微信h5制作网站有哪些,免费微信H5页面制作工具?
Laravel如何使用.env文件管理环境变量?(最佳实践)
如何在万网ECS上快速搭建专属网站?
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
Laravel如何自定义分页视图?(Pagination示例)
详解阿里云nginx服务器多站点的配置
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
利用python获取某年中每个月的第一天和最后一天
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
如何在万网开始建站?分步指南解析
韩国服务器如何优化跨境访问实现高效连接?
java获取注册ip实例
如何快速搭建高效可靠的建站解决方案?
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
Android自定义控件实现温度旋转按钮效果
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
制作企业网站建设方案,怎样建设一个公司网站?
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
如何基于PHP生成高效IDC网络公司建站源码?
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
如何在阿里云ECS服务器部署织梦CMS网站?
Python数据仓库与ETL构建实战_Airflow调度流程详解
如何快速搭建虚拟主机网站?新手必看指南
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
如何在IIS中新建站点并配置端口与IP地址?


字段无效;若字段非 JSON 类型,需迁移改为 json 类型,或改用 'object' 铸造、自定义 Cast 类处理。