学说:可翻译不会为由@ManyToOne(或其他协会)链接的实体提供翻译

时间:2015-12-07 14:39:40

标签: doctrine-orm doctrine associations translation model-associations

假设您有一个类别实体:

class Category 
{
    /**
     * @Gedmo\Translatable
     */
    private $categoryName;
}

和模块实体。
每个模块属于一个类别:

class Module 
{
    /**
     * @Gedmo\Translatable
     */
    private $moduleName;

    /**
     * @ManyToOne(targetEntity="Module")
     */
    private $category;
}

使用查询提示我可以将模块转换为特定的语言环境:

function getModule($id, $locale) 
{
    $query = $em->createQuery('select m from AppBundle\Entity\Module m where m.id=' . $id);
    $query->setHint(TranslatableListener::HINT_TRANSLATABLE_LOCALE, $locale);
    $query->setHint(
        \Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER,
        'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
    );
    $module = $query->getSingleResult();
    return $module;
}

测试:

$module = getModule(1234, 'en');
// SUCCEED
$this->assertEquals('module name in english', $module->getModuleName();
$category = $module->getCategory();
// FAIL !
$this->assertEquals('category name in english', $category->getModuleName();
// SUCCEED (but one more request)
$category->setTranslatableLocale('en');
$em->refresh($category);
$this->assertEquals('category name in english', $category->getModuleName();

简而言之:查询提示能够将JOIN插入到Module实体的SELECT语句中。 调用$ module-> getCategory()将触发延迟加载。但是这一次,没有翻译JOINed。 意思是我必须明确要求提供该类别的英文版本。

问题:在查询所有者实体时是否可以翻译关联实体? (让FAILed测试成功)

我已经尝试过对ManyToOne关联的热切提取。因为我在通过DQL查询而无法工作。

更新:

要使这个特定的例子起作用(并且有更好的代码),我可以在我的DQL中加入类别:

select m,c from Module join m.category where m.id=id

这将使用正确的翻译加载模块及其类别。

但在一个完美的世界里,我很想拥有像这样的通用代码:

protected function getEntityById($className, $id, $locale = null)
{
    $dql = 'select e from AppBundle\Entity\\' . $className . ' e where e.id=' . $id;
    $query = $this->em->createQuery($dql);
    $query->setHint(
        \Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE,
        $locale
    );
    $query->setHint(
        \Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER,
        'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
    );
    $entity = $query->getSingleResult();
    return $entity;
}

如何更新这段代码以使相关实体加载正确的语言环境?

1 个答案:

答案 0 :(得分:0)

我担心没有办法影响$module->getCategory()的行为。只有使用doctrine filters才能影响关联的加载。不幸的是,这些过滤器只能添加到请求的WHERE部分,因此无法添加连接。

我会在类别存储库中创建一个函数,以便像getModule()中一样使用正确的翻译来获取类别。我不认为还有另一种方式。例如:

$category = $categoryRepository->findByModule18n($module, $locale);