sf2 Gedmo可翻译查询在翻译时不返回完整结果集

时间:2015-11-05 12:16:04

标签: php sql-server symfony doctrine-orm

对Symfony 2使用Gedmo Translatable Doctrine扩展,我对数据库查询有一些奇怪的行为/错误。

要获取具有已翻译属性的元素列表,我在查询中使用'SetHint'方法,如the documentation中所述:

$query->setHint(
        Query::HINT_CUSTOM_OUTPUT_WALKER,
        'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
    );

    $query->setHint(TranslatableListener::HINT_TRANSLATABLE_LOCALE, $locale);

这很有效,但在某些情况下,(当我不在默认语言环境中,然后需要翻译时),查询只返回一个或两个结果,而不是完整的结果集。

一个奇怪的事情是,它只发生在生产服务器上(在Linux下),并且无法在本地WAMP服务器上再现,无论是在开发环境还是生产环境中。

我终于发现,当我尝试加载一组不必自行翻译的实体,但附加了子实体(OneToMany)并加入必须翻译的查询时,情况就发生了。

这样做的原因是主查询是在不可翻译的实体上完成的,'setHint'方法没有应用于查询,因此子元素无法翻译,或类似的东西..

因此,我第一次通过在父实体的存储库中应用Gedmo Translatable来解决该问题,以便将setHint方法应用于查询,并将所需的语言环境传递给它。

但我再次享受这个问题。

之前有没有人遇到过这种情况? 有没有办法找出这里发生了什么? 上帝存在吗?

感谢您的回答。

编辑: 经过一些研究和调试,我发现getArrayResult()返回完整的集合。这意味着问题似乎位于Doctrine的Entity Object Hydratation中。

...............(帮助!).................

1 个答案:

答案 0 :(得分:0)

在将问题提交给Gedmo / Translatable author l3pp4rd后,他终于发现这是一个查询缓存问题。

解决方案是将Doctrine Query Cache变为false:

$query = $qb->getQuery()->useQueryCache(false);

所以我完整的可翻译查询代码,为了通过一个查询直接在结果的水合对象中翻译字段是:

$query = $qb->getQuery()->useQueryCache(false);

$query->setHint(
    Query::HINT_CUSTOM_OUTPUT_WALKER,
    'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
);

$query->setHint(TranslatableListener::HINT_TRANSLATABLE_LOCALE, $locale);

return $query;

谢谢L3pp4rd!