Laravel Eloquent如何将JSON数组存储到MySQL 8的audiotags字段
解决方案
步骤1:修改数据表字段类型为MySQL原生JSON类型
MySQL 8原生支持JSON数据类型,相比varchar有以下优势:
- 自动校验存储内容的JSON格式合法性
- 最大存储容量约1GB,远高于varchar的64KB上限
- 支持原生JSON查询函数,方便后续对字段内的数据做检索操作
你可以通过Laravel迁移修改字段,代码示例:
Schema::table('channels', function (Blueprint $table) { $table->json('audiotags')->nullable(); });
如果是手动改表,直接执行SQL即可:
ALTER TABLE channels ADD COLUMN audiotags JSON NULL;
步骤2:配置Eloquent模型类型转换
在Channel模型中添加$casts属性,让ORM自动处理JSON的序列化/反序列化操作,不需要手动做转义处理:
class Channel extends Model { protected $casts = [ // 其他已有的cast配置保留 'audiotags' => 'array', ]; }
配置完成后,你可以直接给audiotags赋值数组格式的数据,保存时ORM会自动转为合法的JSON字符串存入数据库;读取数据时也会自动转为数组,不需要手动调用json_decode。
步骤3:业务代码无需额外调整
你当前的业务代码可以直接使用:
$channels_input['audiotags'] = $input['audiotags']; $channel_data = Channel::create($channels_input);
注意:如果$input['audiotags']是前端传入的JSON字符串,你可以先调用json_decode($input['audiotags'], true)转为数组后再赋值,避免出现转义错误。
内容的提问来源于stack exchange,提问作者Jason Polydor
相关产品推荐
相关产品推荐

