如何从MySQL Laravel的JSON字段中的文档中删除/删除项目

时间:2018-08-04 03:38:12

标签: mysql laravel mysql-json

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

谢谢你们

3 个答案:

答案 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);
}