使用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'
]);
没有错误。
答案 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)
检查您的注册表模型中的可填充数组