2016-03-23 1 views
6

Я пытаюсь создать систему примечаний/комментариев для области администратора с новой поддержкой MySQL JSON. Комментарии должны быть доступны для редактирования, и я хотел бы добавить поддержку для других вещей в будущем, возможно, вложения файлов (будет хранить путь к файлу в JSON, а не только сам файл!).MySQL 5.7.8 JSON объединяет новые данные

{ 
    "comments": [ 
    { 
     "comment": "This is a comment", 
     "user_id": 5, 
     "datecreated": "2016-03-19" 
    }, 
    { 
     "comment": "This is a comment", 
     "user_id": 1, 
     "datecreated": "2016-03-19" 
     "comments": [ 
     { 
      "comment": "This is a sub-comment", 
      "user_id": 4, 
      "datecreated": "2016-03-19" 
     }, 
     { 
      "comment": "This is a sub-comment", 
      "user_id": 4, 
      "datecreated": "2016-03-19" 
     } 
     ] 
    } 
    ] 
} 

Я думал, что будет способ объединить в новых данных, подобных array_merge() без необходимости целевого конкретного ключа каждый раз.

Этот запрос работает, но он нацелен только на одно, текстовое содержимое комментария. Если бы я хотел добавить/редактировать теги, вложения изображений или файлов и т. Д., То мне понадобится очень длинный запрос или несколько запросов.

UPDATE shared_notes SET json = JSON_REPLACE(json, "$.comments[1].comment", "This is a test comment") WHERE note_id = :note_id 

Я попытался с помощью функции JSON_REPLACE и JSON_SET с JSON_OBJECT но перезаписывает все ключи, которые не указаны, что означает user_id, datecreated и любые комментарии к югу перезаписаны.

UPDATE shared_notes SET json = JSON_REPLACE(json, "$.comments[1]", JSON_OBJECT("comment", "This is a test comment")) WHERE note_id = :note_id 

Это Франкенштейна из запроса почти работает, но он на самом деле сцепляет обновленный комментарий на конец старого:

UPDATE shared_notes SET json = JSON_SET(json, "$.comments[1]", JSON_MERGE(JSON_EXTRACT(json, "$.comments[1]"), CAST('{"comment":"Test"}' AS JSON))) WHERE note_id = :note_id 

Так есть лучший способ легко/динамически обновлять JSON с помощью MySQL или нацеливается на $.comments[1].comment, $.comments[1][0].user_id и т. Д. Единственный способ?

+0

О человек, я просто чувствую вашу боль. Я не могу понять, как такие функции не являются частью предоставленных json-функций. Это такая основная потребность! – EscapeNetscape

ответ

0

Это очень поздно ответ, но все равно - вы можете сделать это следующим образом:

create table sampl_test(id int, comments json); 
insert into sampl_test values(1, 
'{ 
    "comments": [ 
     { 
      "comment": "This is a comment", 
      "user_id": 5, 
      "datecreated": "2016-03-19" 
     }, 
     { 
      "comment": "This is a comment", 
      "user_id": 1, 
      "datecreated": "2016-03-19", 
      "comments": [ 
       { 
        "comment": "This is a sub-comment", 
        "user_id": 4, 
        "datecreated": "2016-03-19" 
       }, 
       { 
        "comment": "This is a sub-comment", 
        "user_id": 4, 
        "datecreated": "2016-03-19" 
       } 
      ] 
     } 
    ] 
} 
') 
; 

select json_merge('{"comments" : {"comment" : "This is a test comment" }}', comments) 

from sampl_test;