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 】
相关推荐:
网站制作免费,什么网站能看正片电影?
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
香港服务器选型指南:免备案配置与高效建站方案解析
Laravel如何创建自定义Facades?(详细步骤)
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
iOS验证手机号的正则表达式
再谈Python中的字符串与字符编码(推荐)
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
Laravel如何创建自定义Artisan命令?(代码示例)
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
如何在IIS管理器中快速创建并配置网站?
Laravel如何实现多对多模型关联?(Eloquent教程)
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
大连 网站制作,大连天途有线官网?
如何在IIS7中新建站点?详细步骤解析
IOS倒计时设置UIButton标题title的抖动问题
重庆市网站制作公司,重庆招聘网站哪个好?
如何在服务器上三步完成建站并提升流量?
详解Huffman编码算法之Java实现
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
Laravel如何配置Horizon来管理队列?(安装和使用)
利用JavaScript实现拖拽改变元素大小
Laravel如何处理异常和错误?(Handler示例)
Python图片处理进阶教程_Pillow滤镜与图像增强
如何在IIS中新建站点并配置端口与物理路径?
HTML 中如何正确使用模板变量为元素的 name 属性赋值
网站制作报价单模板图片,小松挖机官方网站报价?
教学论文网站制作软件有哪些,写论文用什么软件
?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
电商网站制作价格怎么算,网上拍卖流程以及规则?
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
如何用wdcp快速搭建高效网站?
node.js报错:Cannot find module 'ejs'的解决办法
北京企业网站设计制作公司,北京铁路集团官方网站?
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
如何快速重置建站主机并恢复默认配置?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
原生JS实现图片轮播切换效果
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
详解MySQL数据库的安装与密码配置
,怎么在广州志愿者网站注册?
如何用已有域名快速搭建网站?
网站制作价目表怎么做,珍爱网婚介费用多少?
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
长沙做网站要多少钱,长沙国安网络怎么样?


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