对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中。
...............(帮助!).................
答案 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!