У меня есть тип поля 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"}?
json_decode() выполню свою работу
@ Сид Спасибо за ответ. Это не так :( Была возвращена ошибка: Аргумент 1, переданный в App\Entity\User::setRoles(), должен иметь тип массива, заданный объект
@Cid Это определенно работает с json_decode: [{"0": "ROLE_USER"}], если я использую его с массивом. Однако мне не нужен этот массив здесь, просто чистый JSON.




Изменять
$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"] в БД, и это работает. Похоже, мой подход к ролям был неправильным. Спасибо, что помогли мне научиться этому.
Если вы используете Doctrine в качестве ORM, вам следует использовать существующий тип отображения json, который хранит массив в виде строки JSON и автоматически (де) сериализует данные.
Спасибо за поддержку!
примечание: json_array устарело с версии 2.6, вместо него следует использовать json.
Вы не хотите хранить такие сериализованные данные в своей БД. Подумайте о нормализации