如何在mysql laravel的json字段中删除文档中的项

ibrsph3r  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(414)

我在数据库的user表中有一个名为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。
谢谢你们

t98cgbkg

t98cgbkg1#

这是拉威尔的方式:

$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);
}
wztqucjr

wztqucjr2#

经过大量的手工阅读和审问,我找到了答案,我将张贴进一步帮助任何有需要的人

UPDATE
  user
SET
  `Data` = JSON_REMOVE(
    `Data`,
    REPLACE(
    REPLACE
      (
        JSON_SEARCH(
          Data,
          'all',
          '10',
          NULL,
          '$**.id'
        ),
        '.id',
        ''
      ),
        '"',
        ''
  )
  )

==>当我搜索和更新查询和内容本身很多次的时候,有一些解释
我注意到,json\u search只对字符串值起作用,如果值是int,它将找不到它,因此我将id的id值转换为string,之后json\u search将返回如下内容 $[the searched key].id 但既然我需要拿到洞的钥匙,我就需要重新制作 ".id" 所以replace within就是为了这个目的,最后一个从结果中删除引号,因为它将是这样的例子 "$[0]" 但是你希望它是这样的 $[0] 所以这就是第二次替换的目的,最后它自己的项目将被删除,数据将被更新
希望拉雷维尔团队能在未来支持这些事情,因为我搜索了很长时间,但不幸没有太多帮助,但我们可以通过原始声明。
==>请注意,如果您搜索的项目在json内容中不存在,则所有json内容都将设置为null

相关问题