我正在尝试从我的一个 Doctrine 表中获取所有记录,包括它的翻译(我正在使用 Doctrine Translatable)。这样做的原因是我想允许用户在提交之前编辑所有数据。我有一些已翻译描述的谷歌地图标记。我想让管理员在使用 javascript / jQuery 构建的客户端 UI 上编辑它们。我不想下载和更新每个标记移动的数据,这就是我决定采用这种方法的原因。
现在我成功地将所有数据(甚至翻译的部分)发送到 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);
这只是一段测试代码(在 News 实体上完成)。这两个转储都产生相同的翻译结果。这是我读到的许多链接之一,这些链接使我想到了这一点:
https://github.com/l3pp4rd/DoctrineExtensions/issues/771
所以我想我的问题如下。谁能告诉我这是否被认为是正确的方法?有没有人有更好的主意来快速解决这个问题?最后也是最重要的,有人知道如何进行这项工作吗?
感谢您的见解和时间。
编辑: 我设法查看了 nifr 指向的捆绑包,但我遇到了一些问题。我按照此页面中的示例进行操作。
首先,当我尝试更新架构时,它会抛出一个错误,提示“在第 146 行的 GalleryTranslation.php 中找不到类 'Symfony\Component\Debug\Exception\ContextErrorException'”。
如果我刷新我的页面,它会显示“运行时通知:GalleryTranslation::setObject() 的声明应该与 Gedmo\Translatable\Entity\MappedSuperclass\AbstractPersonalTranslation::setObject($object) 兼容”虽然我使用 Symfony 代码生成来生成它(生成实体)。
最后,代码生成没有将 id 对象设置为 id,所以有时我会收到一个错误,说翻译实体没有设置 id。