我在数据库的用户表中有一个名为Data的json列。
内容示例:
[
{
"id": 10,
"key": "mail",
"type": "male",
},
{
"id": 5,
"key": "name",
"type": "female",
},
{
"id": 8,
"key": "mail",
"type": "female",
}
]
让我们假设表中的许多行可能具有相同的内容,因此也应该从表的所有行中删除它们,我也想通过键和值来删除项,最后我能想到的是例如,此查询是否要删除ID等于10的项目:
UPDATE
user
SET
`Data` =
JSON_REMOVE(`Data`,JSON_SEARCH(`Data`,'all',10,NULL,'$[*].id'),10)
但是此查询会删除该列的所有内容。
如果有人可以帮助您,将不胜感激。
通过这种方式,因为我似乎找不到在laravel中使用QueryBuilder使其实现的方法,所以它将是RawQuery。
谢谢你们
答案 0 :(得分:2)
经过大量的手动阅读和询问,我找到了答案,我将为需要帮助的人提供进一步的帮助
UPDATE
user
SET
`Data` = JSON_REMOVE(
`Data`,
REPLACE(
REPLACE
(
JSON_SEARCH(
Data,
'all',
'10',
NULL,
'$**.id'
),
'.id',
''
),
'"',
''
)
)
==>我多次搜索和更新查询及其内容时的一些解释
我注意到JSON_SEARCH仅在字符串值上工作,如果该值是int则找不到它,因此我将id的id值转换为字符串后,JSON_SEARCH将返回类似$[the searched key].id
的内容,但是由于我需要获取孔项目的键,我需要重新设置".id"
,因此在内部进行替换是为了该目的,最后从结果中删除引号,因为例如"$[0]"
就是这样,但是JSON_REMOVE希望它像这样$[0]
,所以这是第二次替换的目的,最后将其自身的项目删除并更新数据
希望我的laravel团队将来可以支持这些事情,因为我搜索了很长时间,但很可惜没有太多帮助,但我们可以通过原始声明来解决问题。
==>请注意,如果要搜索的项目不存在于JSON内容中,则所有JSON内容都将设置为NULL
答案 1 :(得分:1)
要从mysql中删除JSON数据,Laravel支持在支持JSON列类型的数据库上查询JSON列类型。当前,这包括MySQL 5.7和Postgres。要查询JSON列,请使用->运算符。
这是存储在数据库中的JSON对象
'{"name":"The Lord of the Rings:The Fellowship of the Ring","language":["Hindi","English","Spanish"]}';
您可以从数据库中获取JSON值
Book::where('attributes->language','LIKE','%English%')
attributes
是列名称,语言是JSON对象中的键
Book::where('attributes->language','LIKE','%English%')->update(['attributes' => DB::raw('JSON_REMOVE(attributes, "$.Language")')]);
答案 2 :(得分:0)
这是Laravel方式:
$jsonString = '[{
"id": 10,
"key": "mail",
"type": "male"
},
{
"id": 5,
"key": "name",
"type": "female"
},
{
"id": 8,
"key": "mail",
"type": "female"
}
]';
// decode json string to array
$data = json_decode($jsonString);
// remove item that id = 10
$data = array_filter($data, function ($item) {
return $item->id != 10;
});
// run the query
foreach ($data as $item){
DB::table('user')->where('id', $item->id)->update($item);
}