我正在使用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语句中,这样可以提高性能,但仍然不够。
有什么想法吗?
答案 0 :(得分:0)
您可以尝试手动优化查询。使用locale作为存储库中的参数
public function getNewestArticles($locale, $limit = 1){
//your own superfast query
}
在控制器中然后使用
设置语言环境$locale = $request->getLocale();
$em->getNewestArticles($locale, $limit);
其他问题:您是否在表上设置了索引?