MohammedZr Ответов: 1

Замените ключ-значение в столбце типа данных JSON в mysql


Я пытаюсь понять, как я могу заменить или отредактировать ключ-значение внутри массива JSON
В основном у меня есть таблица под названием Bills эта таблица содержит несколько столбцов, среди которых есть столбец типа JSON, который содержит массив для products или items в настоящее время bill формат массива таков:-

Array ( [0] => Array 
( [items] => [{"0": "1", "1": "o4", "2": "Efexor", "3": "Eklil", "4": "1", "5": "30", "6": "15", "7": "Phezer", "8": "Venlafaxine", "9": "", "10": "0", "11": "2020-03-25", "12": "2021-08-25", "13": "1", "14": "0", "15": "0", "16": "caps", "17": "..\\upload\\Efexor.jpg",

 "id": "1", "qty": "15", "Sale": "1", "name": "Efexor", "bonus": "0", "price": "30", "company": "Phezer", "draftid": "1", "discount": "0", "imageurl": "..\\upload\\Efexor.jpg", "ownedcom": "Eklil", "packsize": "0", "codenumber": "o4", "chemicalcom": "Venlafaxine", "dosage-form": "caps", "concentration": "", "expirationdate": "2021-08-25", "productiondate": "2020-03-25"},


Итак, как вы можете видеть, массив содержит информацию о таких элементах, как (название компании..и т. д)
то, что я пытаюсь сделать, это заменить конкретный key-value например, Price ключ


Что я уже пробовал:

я попытался использовать некоторые из запросов JSON, такие как (JSON_search, JSON_replace,...другие), поэтому я создал метод класса для его обработки :-

public function AlterJSON($item,$key,$newValue){
       if($this->connected === true){
           try{
               $JsonItems = $this->connection->prepare("UPDATE `bills`
               SET `items` = JSON_REPLACE(`items`, '$.name', ':value')
               WHERE JSON_CONTAINS(`items`, ':item', '$.name');");
               $JsonItems->bindParam(":item",$item);
               $JsonItems->bindParam(":value",$newValue);
               $JsonItems->execute();
               echo 'Value for The'.$key. 'Changed to'. $newValue;
           }
           catch(PDOException $e){
               if($this->errors === true){
                   return $this->error($e->getMessage());
               }else{
                   return false;
               }
           }
       }
   }

1 Ответов

Рейтинг:
1

Garth J Lancaster

Вы еще не опубликовали, в чем проблема с вашим кодом .. 2 мысли

1) Вы можете сделать это таким образом, но это опасно - что, если JSON каким - то образом изменится, вы можете эффективно повредить его - я работал над продуктом, который хранил XML в виде большого двоичного объекта, но изменения не были внесены в сам XML-была создана новая версионная запись ..

2) самый безопасный способ-прочитать правильную запись, извлечь столбец JSON в правильный POCO (т. е. десериализовать), выполнить все необходимые изменения, сериализовать и обновить весь столбец