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

Laravel处理MySQL JSON列坐标数组时格式不符问题求助

问题分析:Laravel处理MySQL JSON列格式不符预期

问题背景

我的MySQL表中有一个JSON列,存储的示例数据为:

[
    [
        -79.4936969567481,
        37.3504643767627
    ],
    [
        -79.4936969567481,
        37.3504643767627
    ]
]

我希望通过Laravel将每个子数组的第一个值设为lat键、第二个值设为lng键,编写的代码如下:

$polygons = Polygon::get();
    
foreach ($polygons as $polygon) {
    $coordinates = $polygon->coordinates;
    
    // Transform the coordinates
    $newCoordinates = array_map(function ($coordinate) {
        return [
            'lat' => $coordinate[0],
            'lng' => $coordinate[1],
        ];
    }, $coordinates);
    
    // Update the model's coordinates column
    $polygon->coordinates = $newCoordinates;
    $polygon->save();
}

执行后得到的结果是:

[
    {
        "lat": -79.4936969567481,
        "lng": 37.3504643767627
    },
    {
        "lat": -79.4936789563065,
        "lng": 37.3504513771715
    }
]

我期望结果中的{替换为[、}替换为]、:替换为=>,请问哪里出错了?


错误原因

你混淆了PHP关联数组和JSON标准格式的表示逻辑:

  • 代码中返回的['lat' => $coordinate[0], 'lng' => $coordinate[1]]是PHP语法的关联数组,但Laravel在处理MySQL JSON列时,会自动将PHP数组序列化为标准JSON格式——PHP关联数组对应JSON的对象({"key": value}),PHP索引数组对应JSON的数组([value1, value2])。
  • 你想要的[lat => ..., lng => ...]是PHP特有的关联数组写法,标准JSON格式中不存在这种表示:JSON里方括号[]仅用于定义有序数组(无键值对),键值对结构只能用大括号{}包裹,冒号:分隔键和值。

解决方案

根据你的实际需求调整:

  1. 如果需要标准JSON键值对结构:当前执行结果是完全正确的JSON格式,符合MySQL JSON列的存储规范,无需修改。
  2. 如果希望保持数组结构(仅语义上对应lat/lng):放弃转换为关联数组,直接保留原数组的顺序(第一个元素为lat,第二个为lng),这样存储的JSON就是嵌套数组格式:
    $newCoordinates = array_map(function ($coordinate) {
        // 直接返回原数组,或添加语义注释
        return $coordinate;
    }, $coordinates);
    
  3. 如果是误解了JSON与PHP数组的差异:需要明确:MySQL JSON列只能存储标准JSON数据,PHP数组只是代码层面的临时结构,保存时会自动转换为JSON格式,两者语法规则不同。

内容的提问来源于stack exchange,提问作者Benjamin Mwendwa Munyoki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 16:53:19