如何从 json 字段 mysql laravel 中的文档 delete/remove 项目
How to delete/remove item from document in json field in mysql laravel
我在数据库中的用户 table 中有一个名为 Data 的 json 列。
内容示例:
[
{
"id": 10,
"key": "mail",
"type": "male",
},
{
"id": 5,
"key": "name",
"type": "female",
},
{
"id": 8,
"key": "mail",
"type": "female",
}
]
让我们假设 table 中的许多行可能具有相同的内容,因此它们应该从 table 的所有行中删除,我想做的是删除一个项目键和值我能想出的最后一件事是这个查询例如我想删除 id 等于 10 的项目:
UPDATE
user
SET
`Data` =
JSON_REMOVE(`Data`,JSON_SEARCH(`Data`,'all',10,NULL,'$[*].id'),10)
但是这个查询删除了该列的所有内容。
如果有人能提供帮助,我们将不胜感激。
顺便说一下,我之所以采用这种方式,是因为我似乎找不到在 laravel 中使用 QueryBuilder 实现它的方法,所以它将是 RawQuery。
谢谢大家
这是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);
}
经过大量手动阅读和询问后,我找到了答案,我会 post 为有需要的任何人提供进一步帮助
UPDATE
user
SET
`Data` = JSON_REMOVE(
`Data`,
REPLACE(
REPLACE
(
JSON_SEARCH(
Data,
'all',
'10',
NULL,
'$**.id'
),
'.id',
''
),
'"',
''
)
)
==> 我多次搜索和更新查询和内容本身时的一些解释
我注意到 JSON_SEARCH 仅在字符串值上工作,如果该值为 int 它将找不到它所以我将 id 的 id(s) 值转换为字符串之后 JSON_SEARCH 将 return 类似这样的东西 $[the searched key].id
但是因为我需要得到洞项目的钥匙我需要重新模式 ".id"
所以替换里面是为了那个目的最后从结果中删除引号因为它会像这样,例如 "$[0]"
但 JSON_REMOVE 希望它像这样 $[0]
所以这就是第二次替换的目的,最终它自己的项目将被删除,数据将是已更新
希望 laravel 团队将来可以支持这些事情,因为我搜索了很长时间,但不幸的是没有太多帮助,但我们可以通过原始声明完成。
==> 请注意,如果您搜索的项目不存在于 JSON 内容中,则所有 JSON 内容都将设置为空
我在数据库中的用户 table 中有一个名为 Data 的 json 列。
内容示例:
[
{
"id": 10,
"key": "mail",
"type": "male",
},
{
"id": 5,
"key": "name",
"type": "female",
},
{
"id": 8,
"key": "mail",
"type": "female",
}
]
让我们假设 table 中的许多行可能具有相同的内容,因此它们应该从 table 的所有行中删除,我想做的是删除一个项目键和值我能想出的最后一件事是这个查询例如我想删除 id 等于 10 的项目:
UPDATE
user
SET
`Data` =
JSON_REMOVE(`Data`,JSON_SEARCH(`Data`,'all',10,NULL,'$[*].id'),10)
但是这个查询删除了该列的所有内容。
如果有人能提供帮助,我们将不胜感激。
顺便说一下,我之所以采用这种方式,是因为我似乎找不到在 laravel 中使用 QueryBuilder 实现它的方法,所以它将是 RawQuery。
谢谢大家
这是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);
}
经过大量手动阅读和询问后,我找到了答案,我会 post 为有需要的任何人提供进一步帮助
UPDATE
user
SET
`Data` = JSON_REMOVE(
`Data`,
REPLACE(
REPLACE
(
JSON_SEARCH(
Data,
'all',
'10',
NULL,
'$**.id'
),
'.id',
''
),
'"',
''
)
)
==> 我多次搜索和更新查询和内容本身时的一些解释
我注意到 JSON_SEARCH 仅在字符串值上工作,如果该值为 int 它将找不到它所以我将 id 的 id(s) 值转换为字符串之后 JSON_SEARCH 将 return 类似这样的东西 $[the searched key].id
但是因为我需要得到洞项目的钥匙我需要重新模式 ".id"
所以替换里面是为了那个目的最后从结果中删除引号因为它会像这样,例如 "$[0]"
但 JSON_REMOVE 希望它像这样 $[0]
所以这就是第二次替换的目的,最终它自己的项目将被删除,数据将是已更新
希望 laravel 团队将来可以支持这些事情,因为我搜索了很长时间,但不幸的是没有太多帮助,但我们可以通过原始声明完成。
==> 请注意,如果您搜索的项目不存在于 JSON 内容中,则所有 JSON 内容都将设置为空