【问题标题】:How to delete/remove item from document in json field in mysql laravel如何从 mysql laravel 的 json 字段中的文档中删除/删除项目
【发布时间】:2019-01-11 21:54:29
【问题描述】:

我在数据库的用户表中有一个名为 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。

谢谢大家

【问题讨论】:

    标签: mysql laravel mysql-json


    【解决方案1】:

    这是 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);
    }
    

    【讨论】:

    • 谢谢,我可以在 php.ini 中做到这一点。但我希望它在 MySQL 端进行,因为一旦我获得所请求项目的密钥,它就可以使用 JSON REMOVE 进行,这就是为什么有 JSON_SEARCH 但我的错误是如何知道项目的动态密钥。不管怎样,谢谢你的努力
    • 我明白了,所以这个问题只是关于 MySQL,而不是 Laravel。
    • 您发布的答案几乎比 laravel 更适合原生 php,如果可以在单个语句中使用查询生成器完成它,这将很好,否则原始 sql 会做的伎俩thankalmek你
    【解决方案2】:

    经过大量的人工阅读和审问,我找到了答案,我将发布为有需要的人提供进一步的帮助

     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 将返回类似 $[the searched key].id 的内容,但因为我需要要获得孔项的密钥,我需要重新修改 ".id" 所以替换内是为了这个目的,最后从结果中删除引号,因为它会像这样,例如 "$[0]" 但 JSON_REMOVE 希望它是这样的$[0] 这就是第二次替换的目的,最后它自己的项目将被删除并更新数据

    希望 laravel 团队将来可以支持这些事情,因为我搜索了很长时间,但不幸的是没有太多帮助,但我们可以通过原始语句完成。

    ==> 请注意,如果您搜索的项目不存在于 JSON 内容中,则所有 JSON 内容都将设置为 NULL

    【讨论】:

    • 关于最后一条评论,如果放入事务中,捕获 Throwable 然后回滚将防止这种截断发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2019-07-28
    • 2016-12-11
    • 1970-01-01
    相关资源
    最近更新 更多