Doctrine Translatable如何只用翻译来获取记录

时间:2013-05-31 03:09:12

标签: symfony doctrine multilingual doctrine-extensions

我正在使用Symfony2 + Doctrine +来自DoctrineExtensions的翻译。

我有一个实体文章,其中包含一些可翻译的字段,如标题和内容。现在发生的事情是我用中文创作了一堆文章,但没有添加英文翻译。当我尝试在我的主页上显示前八篇最新文章时,这给了我一些问题...当我用英语查看我的主页时,它会显示一堆无标题的文章(中文文章没有英文翻译)。

我通过使用ORM查询提示在Translatable扩展中找到了解决方案: “\学说\ ORM \查询:: 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语句中,这样可以提高性能,但仍然不够。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试手动优化查询。使用locale作为存储库中的参数

public function getNewestArticles($locale, $limit = 1){
   //your own superfast query
}
在控制器中

然后使用

设置语言环境
$locale = $request->getLocale();
$em->getNewestArticles($locale, $limit);

其他问题:您是否在表上设置了索引?