Как добавить поле JSON в БД?

У меня есть тип поля 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"}?

Вы не хотите хранить такие сериализованные данные в своей БД. Подумайте о нормализации

Cid 16.05.2019 11:34
json_decode() выполню свою работу
Cid 16.05.2019 11:35

@ Сид Спасибо за ответ. Это не так :( Была возвращена ошибка: Аргумент 1, переданный в App\Entity\User::setRoles(), должен иметь тип массива, заданный объект

szerz 16.05.2019 11:37

@Cid Это определенно работает с json_decode: [{"0": "ROLE_USER"}], если я использую его с массивом. Однако мне не нужен этот массив здесь, просто чистый JSON.

szerz 16.05.2019 11:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
4
4 943
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Изменять

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

К

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

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


Ваше объявление массива неверно. Вы помещаете ОДИН элемент в массив, и этот элемент: {"0": "ROLE_USER"} представляет собой обычную строку.

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

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


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

{"0": "ROLE_USER"}

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

{"ROLE_USER"}

Но оба случая приведут к одному и тому же массиву:

array {
  0 => ROLE_USER  
}

У меня есть ["ROLE_ADMIN"] в БД, и это работает. Похоже, мой подход к ролям был неправильным. Спасибо, что помогли мне научиться этому.

szerz 16.05.2019 11:54

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

Спасибо за поддержку!

szerz 16.05.2019 20:24

примечание: json_array устарело с версии 2.6, вместо него следует использовать json.

Thomas Baier 20.05.2019 14:35

Другие вопросы по теме