Doctrine Translatable как извлекать записи только с переводом

Я использую 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, что повышает производительность, но этого недостаточно.

Любые идеи?


person Jones03    schedule 31.05.2013    source источник


Ответы (1)


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

public function getNewestArticles($locale, $limit = 1){
   //your own superfast query
}

в контроллере, затем установите локаль с помощью

$locale = $request->getLocale();
$em->getNewestArticles($locale, $limit);

дополнительный вопрос: вы установили индексы на свои таблицы?

person Andrej Sramko    schedule 04.04.2014