Laravel JSON字段无法更新或更新或创建(如果不存在)

时间:2018-10-02 12:06:07

标签: laravel laravel-5

使用Laravel 5.6。我有一个名为metas的JSON字段,插入和更新可以按预期工作,但有1件事:如果metas中不存在该字段,则不会在update或updateOrdCreate方法上创建该字段。存在的字段更新没有问题。

以下是示例metas的内容:

{
    "date": "2018-09-17",
    "name": "r08"
}

我可以更新“日期”和“名称”,但是在某些情况下,我需要为示例“距离”添加新字段,但我不能这样做:

Registries::where('id', $registry_id)->update([
    'metas->distance' => '200km'
]);

也尝试过:

Registries::where('id', $registry_id)->updateOrCreate([
    'metas->distance' => '200km'
]);

没有错误。

3 个答案:

答案 0 :(得分:1)

Laravel JSON casting仅为您创建JSON访问器(反序列化器)和mutator(序列化器):

  

当在Eloquent模型上访问该属性时,向该属性添加array转换将自动将该属性反序列化为PHP数组。

     

一旦定义了cast,您就可以访问该属性,并且该属性将自动从JSON反序列化为PHP数组。当您设置属性值时,给定的数组将自动序列化回JSON以进行存储

所以更新JSON /数组字段的唯一方法是覆盖其值:

$registry = Registries::find($registry_id);
$registry->metas['distance'] = '200km';
$registry->save();

Registries::updateOrCreate(
    ['id', $registry_id], 
    ['metas' => json_encode([
        'date' => '2018-09-17',
        'name'=> 'r08',
        'distance' => '200km',
    ])]
);

答案 1 :(得分:0)

您可以尝试以下方法吗? updateOrCreate()方法需要两个数组参数,第一个应为标识符,第二个应包含更新创建数据。

Registries::updateOrCreate([
    'id' => $registry_id
],[
    'metas->distance' => '200km'
]);

答案 2 :(得分:0)

检查您的注册表模型中的可填充数组