Как игнорировать / ловить Доктрину "Ошибка преобразования значения базы данных" - PullRequest
0 голосов
/ 21 сентября 2018

Я использую Doctrine в проекте Symfony 2.8.Одна из сущностей использует поле массива:

/**
 * @ORM\Column(name="raw_data", type="array", nullable=true)
 */
protected $data;

Из-за ошибки некоторые сущности сохранили строку в этом свойстве вместо массива:

$entity->setData('some string');
// ==> DB value: s:11:"some string";

Сохранение сущностей не вызвалолюбая проблема.Однако при попытке загрузить сущность из БД Doctrine выдает ошибку:

Не удалось преобразовать значение базы данных "s: 11:" some str ... "в массив типа Doctrine

Это имеет смысл, поскольку значение не представляет собой массив.

Конечно, я мог бы манипулировать БД вручную, искать все значения, которые не начинаются с a:...., и исправлять или заменять их.

Но есть ли способ заставить Doctrine автоматически игнорировать такую ​​ошибку и вместо этого возвращать пустой массив?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Я не знаю, есть ли лучший способ, но мне кажется, что вам нужен взлом, чтобы преодолеть эту проблему.В вашем случае я бы получил все ваши сущности в виде массивов, используя $query->getArrayResult(); вместо $query->getResult();.Затем найдите, какие объекты неправильно сформировали поле данных, и удалите их с помощью функции querybuilder delete().

. Таким образом, вы можете снова заставить работать свой код, а затем добавить некоторую проверку, чтобы это больше не повторилось.

0 голосов
/ 21 сентября 2018

Я бы исправил это с помощью сценария миграции, созданного вручную, чтобы сохранить код в чистоте от любых «обходных путей» для ошибок, сделанных ранее.

Используйте doctrine / migrations-bundle, если вы еще этого не сделали.Это облегчает жизнь.

Затем сгенерируйте новый класс миграции с bin/console mig:mig:gen, и там можно использовать обычный sql для исправления значений.(выполнить повторную сериализацию после создания массива)

Вы даже можете получить доступ к контейнеру из миграции.

...