Доктрина: Translatable не будет предоставлять переводы для сущностей, связанных @ManyToOne (или другими ассоциациями)

Скажем, у вас есть объект категории:

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 в оператор SELECT для объекта Module. Вызов $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;
}

Как обновить этот фрагмент кода, чтобы связанные объекты загружались с правильной локалью?


person Antoine Viau    schedule 07.12.2015    source источник


Ответы (1)