Symfony和Doctrine - 使用Translatable获取所有实体,包括其翻译

时间:2013-08-01 18:18:58

标签: symfony doctrine translation

我正在尝试从我的一个Doctrine表中获取所有记录,包括其翻译(我正在使用Doctrine Translatable)。这样做的原因是我希望允许用户在提交之前编辑所有数据。我有一些谷歌地图标记已翻译描述。我想允许管理员在使用javascript / jQuery构建的客户端UI上编辑它们。我不想下载和更新每个标记移动的数据,这就是我决定采用这种方法的原因。

现在我已成功将所有数据(甚至已翻译的部分)发送到用户界面,但需要进行大量查询。首先,我从数据库中提取所有默认数据,然后翻译每条记录。我知道可怕的解决方案。我想重构这段代码,每个请求需要一到两个查询。我的第一个想法是创建一个查询,该查询将对翻译进行内部查询。由于复杂性,我放弃了这个想法,我不想直接加载翻译表。

下一个想法是关于使用两个相同的查询但具有不同的翻译提示。在执行两个查询之后,我将创建模型对象,这些对象将保存所有需要的数据并从那里继续。这让我非常接近解决方案,但我仍然遇到问题。一旦我设置了一个提示来检索翻译,两个查询(翻译和原始)都会返回翻译结果。到目前为止,这是我的代码:

$em = $this->getEntityManager();
$qb = $em->getRepository('SomeSite\SiteBundle\Entity\News')
    ->createQueryBuilder('e')
    ->select();

$q1 = $qb->getQuery();
$q2 = $qb->getQuery();

$q2->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker');
$q2->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, 'en');

$en = $q2->getResult();

$q1->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker');
$q1->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, 'hr');

$hr = $q1->getResult();
var_dump($hr);
var_dump($en);

这只是一段测试代码(在新闻实体上完成)。这两个转储都产生相同的转换结果。以下是我阅读的许多链接中的一个,这些链接引导我达到这一点:

https://github.com/l3pp4rd/DoctrineExtensions/issues/771

所以我想我的问题如下。谁能告诉我这是否会被认为是正确的方法?有没有人有更好的想法快速解决这个问题?最后也是最重要的是,有谁知道如何使这项工作?

感谢您的见解和时间。

修改 我设法看看nifr指向的捆绑包,但我遇到了一些问题。我按照this页面上的示例进行了操作。

首先,当我尝试更新架构时,它会抛出一个错误,说“在第146行的GalleryTranslation.php中找不到类”Symfony \ Component \ Debug \ Exception \ ContextErrorException“。

如果我刷新页面,它会说“运行时通知:GalleryTranslation :: setObject()的声明应与Gedmo \ Translatable \ Entity \ MappedSuperclass \ AbstractPersonalTranslation :: setObject($ object)兼容”尽管我使用了Symfony代码生成它(生成实体)。

最后,代码生成没有将id对象设置为id,因此有时我会收到一条错误,指出翻译实体没有设置id。

1 个答案:

答案 0 :(得分:0)

我建议你看看a2lix/TranslationFormBundle,它解决了这种情况。

设置和支持DoctrineExtensions AND KnpDoctrineBehaviors非常容易。

我现在已经多次使用它了。