У меня есть рабочий объект с полем (типа ArrayCollection), который сопоставляется с доктриной в столбце типа массив.
Теперь мне нужно, чтобы это поле было переводимым (доктринальное поведение), но я получаю Не удалось преобразовать значение базы данных «» в массив типа Doctrine ConversionException при получении нетранслируемой локали.
Как я могу сохранить функциональность массива и сделать его переводимым?
/**
* @var ArrayCollection
*
* @Gedmo\Translatable
* @ORM\Column(name="categories", type="array")
*/
private $categories;
// ... Controller ProductController nitty gritty
public function showAction(Request $request, $id, $locale)
{
// omitted stuff, load $product by $id
$product->setTranslatableLocale($locale); // load translations
$em->refresh($product);
return $this->render('AcmeExampleBundle:Product:show.html.twig', [
'product' => $product
]);
}
ConversionException
Не удалось преобразовать значение базы данных «» в массив типа Doctrine
Трассировка стека исключений: Pastebin
Похоже, вы пытаетесь преобразовать пустую строку из базы данных в массив. Проблема исходит от categories
колонка. Вместо сериализованного пустого массива этот столбец содержит пустые значения.
Возможное решение — заменить пустую строку ожидаемым массивом следующим образом:
UPDATE `product` SET categories="a:0:{}" WHERE categories= "";
Надеюсь, это может помочь.
Я был неправ. Я пытался установить свой собственный {locale}
сегмент маршрута, когда я должен был использовать родной {_locale}
(обратите внимание на подчеркивание — документация).
Если вы позволите Symfony обрабатывать локали через маршрутизацию, переводимый будет прозрачно обрабатывать переводы сущностей (включая отправку форм), и нет необходимости в вызове $entity::setTranslatableLocale()
ни EntityManager::refresh()
,
Нет необходимости в специальной обработке для массивов полей, они легко переводятся из коробки.