首页 > 解决方案 > Laravel 8 在数据库中手动保存 JSON

问题描述

当我将产品保存到我的数据库列图像时,JSON 列中的所有内容都已正确填充:

[
    {
        "path": "/uploads/n2R9y4l977/20210104_125201.jpg",
        "index": "0"
    },
    {
        "path": "/uploads/n2R9y4l977/20201222_144730.jpg",
        "index": "1"
    }
]

所以我接下来要做的是通过检查给定数据是否与索引匹配来删除该列中的一行。所以我做了以下事情:

    $newImage = [];
    $product = product::where(["id" => $product_id])->first();
    //$product = product::find($product_id); gives the same result

    $originalProduct = $product->images;

    foreach($originalProduct as $key => $images) {
        if ($images->index == $index) {
            unset($originalProduct[$key]);
        }
    }

    foreach($originalProduct as $key => $image) {
        $newImage[$key] = array("index" => "".$key, "path" => $image->path);
    }

    $product->images = $newImage;
    $product->save(); //also tried $product->update();

这给了我这个:

{
    "1": {
        "path": "/uploads/n2R9y4l977/20201222_144730.jpg",
        "index": "1"
    }
}

产品型号有一个演员表:

protected $casts = [
        'images' => 'object',
    ];

但我需要它与我第一次将其保存到数据库时完全一样。我该怎么做呢?

标签: jsondatabaselaravel

解决方案


您可以使用以下内容获取没有演员表的 json:

$originalProduct = $product->getRawOriginal(‘images’);

或者,如果这不会破坏其他地方的功能,您可以将强制转换更改为数组:

protected $casts = [
    ‘images’ => ‘array’
];

推荐阅读