Я использую Symfony2 + Doctrine + Translatable из DoctrineExtensions.
У меня есть статья о сущности, в которой есть несколько переводимых полей, таких как заголовок и содержание. Сейчас происходит то, что я создал кучу статей на китайском языке, но не добавил перевод на английский. Это доставляет мне некоторые проблемы, когда я пытаюсь отобразить 8 самых последних статей на своей домашней странице... Когда я просматриваю свою домашнюю страницу на английском языке, она показывает там кучу статей без заголовков (статьи на китайском языке, у которых нет перевод на английском).
Я нашел решение для этого в расширении Translatable, используя подсказку запроса ORM: «\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER».
Это позволяет вам напрямую запрашивать переведенные поля вашей сущности, которые фактически хранятся в ext_translations, а не в таблице сущности.
В результате код, который я использую для получения статей для домашней страницы, выглядит так:
public function getNewestArticles($limit = 1){
$dql =
"SELECT a FROM NewsBundle:Article a
WHERE a.published = 1
AND a.title != ''
ORDER BY a.created_at DESC";
$query = $this->_em->createQuery($dql);
$query->setMaxResults($limit);
$query->setHint(
\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER,
'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
);
$result = $query->getResult();
return $result;
}
Это действительно работает, но сгенерированный запрос настолько неэффективен, что сильно замедляет страницу... Я говорю о 1800 мс для этого запроса. Я также пытался просто поместить нужные мне поля в оператор select, что повышает производительность, но этого недостаточно.
Любые идеи?