Как добавить поле JSON в БД? - PullRequest
1 голос
/ 16 мая 2019

У меня есть некоторый тип поля JSON в БД (добавлен вручную):

{"0": "ROLE_USER"}

Модель пользователя:

/**
 * @ORM\Column(type="json")
 */
private $roles = [];

Контроллер:

$user->setRoles(array('{"0": "ROLE_USER"}'));

Это работает, добавляя данные в БД:

["{\"0\": \"ROLE_USER\"}"]

Если я добавляю их без массива - возникает ошибка:

Argument 1 passed to App\Entity\User::setRoles()
must be of the type array, string given

Что мне нужно сделать, чтобы точно {"0": "ROLE_USER"} в БД?

Ответы [ 2 ]

3 голосов
/ 16 мая 2019

Изменение

$user->setRoles(array('{"0": "ROLE_USER"}'));

Для

$user->setRoles(["ROLE_USER"]);

Это сделает работу.


Ваше объявление массива неверно. Вы помещаете один элемент в массив, и элемент выглядит так: {"0": "ROLE_USER"} в виде простой строки.

Для столбца доктрины "json" вам не нужно самим json_encode или json_decode. Доктрина справится с этим за вас!

Поток:
1) Вы даете Доктрине массив
2) Doctrine будет json_encode вашего массива и сохранить его в столбце как json_data
3) Если вы запросите значение столбца, doctrine будет json_decode для вашего массива, чтобы вы могли снова работать с ним.


Ваша желаемая цель также неверна. Вы хотите json_data, как это:

{"0": "ROLE_USER"}

Но я думаю, у вас будут такие данные:

{"ROLE_USER"}

Но в обоих случаях используется один и тот же массив:

array {
  0 => ROLE_USER  
}
0 голосов
/ 16 мая 2019

Если вы используете Doctrine в качестве ORM, вы должны использовать существующий тип отображения json, который хранит массив в виде строки JSON и автоматически (де) сериализует данные.

...