0

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

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

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

有任何想法吗?

4

1 回答 1

0

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

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

然后在控制器中设置语言环境

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

附加问题:您是否在表上设置了索引?

于 2014-04-04T08:56:50.290 回答