Laravel 9多语言JSON字段Seeder存储异常问题求助
解决Laravel 9中JSON字段存储阿拉伯文时的双重转义问题
问题场景
在Laravel 9的Seeder中插入包含阿拉伯文的JSON字段数据:
public function run() { ClientPermission::create([ 'id' => 1, 'section_ar' => 'المريض', 'options_ar' => [ 'patients_tree' => 'قوائم المريض', ], ]); }
模型已配置JSON类型转换:
protected $casts = [ 'options_ar' => 'json', 'options_en' => 'json', ];
但MySQL中存储的options_ar字段出现异常:
{"patients_tree":"\"\u0642\u0648\u0627\u0626\u0645 \u0627\u0644\u0645\u0631\u064a\u0636\""}
手动使用json_encode('قوائم المريض', JSON_FORCE_OBJECT | JSON_UNESCAPED_UNICODE)处理后问题依旧。
问题原因
出现双重转义的核心原因是重复编码:
- Laravel的
json类型转换会自动将数组编码为JSON格式存储 - 若手动对字符串执行
json_encode,模型会将已编码的字符串再次转义,最终导致存储内容出现嵌套引号和多余转义字符
解决方案
直接传递数组,无需手动编码
保持Seeder中的数组结构即可,模型的$casts会自动完成正确的JSON编码,包括处理阿拉伯文等Unicode字符:public function run() { ClientPermission::create([ 'id' => 1, 'section_ar' => 'المريض', 'options_ar' => [ 'patients_tree' => 'قوائم المريض', ], ]); }确认数据库字段类型正确
确保MySQL中options_ar字段的类型为json或longtext(不推荐使用varchar,可能导致数据截断或编码异常)。验证类型转换生效
可在Seeder中添加验证代码,确认取出的数据是正确的数组格式:$permission = ClientPermission::find(1); dd($permission->options_ar); // 应输出数组:['patients_tree' => 'قوائم المريض']
内容的提问来源于stack exchange,提问作者Evo
相关产品推荐
相关产品推荐

