You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,模型会将已编码的字符串再次转义,最终导致存储内容出现嵌套引号和多余转义字符

解决方案

  1. 直接传递数组,无需手动编码
    保持Seeder中的数组结构即可,模型的$casts会自动完成正确的JSON编码,包括处理阿拉伯文等Unicode字符:

    public function run()
    {
        ClientPermission::create([
            'id' => 1,
            'section_ar' => 'المريض',
            'options_ar' => [
                'patients_tree'   => 'قوائم المريض',
            ],
        ]);
    }
    
  2. 确认数据库字段类型正确
    确保MySQL中options_ar字段的类型为json或longtext(不推荐使用varchar,可能导致数据截断或编码异常)。

  3. 验证类型转换生效
    可在Seeder中添加验证代码,确认取出的数据是正确的数组格式:

    $permission = ClientPermission::find(1);
    dd($permission->options_ar); // 应输出数组:['patients_tree' => 'قوائم المريض']
    

内容的提问来源于stack exchange,提问作者Evo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:01:20