У меня есть древовидная структура с родительским полем.В настоящее время я пытаюсь заставить все родительские узлы отображать путь к текущему узлу.
Обычно я выполняю цикл while для обработки всех узлов.
$current = $node->getParent();
while($current) {
// do something
$current = $current->getParent();
}
Работает метод findById по умолчанию
. Поскольку у объекта есть несколько агрегированных полей, я использую метод настраиваемого репозитория для загрузки всех основных полей одним запросом.
public function findNodeByIdWithMeta($id) {
return $this->getEntityManager()
->createQuery('
SELECT p, a, c, cc, ca, pp FROM
TestingNestedObjectBundle:NestedObject p
JOIN p.actions a
LEFT JOIN p.children c
LEFT JOIN c.children cc
LEFT JOIN c.actions ca
LEFT JOIN p.parent pp
WHERE p.id = :id
')
->setParameter('id', $id)
->setHint(
\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER,
'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
)
->getOneOrNullResult();
}
С этим кодом загрузка родителей не выполняется. Я получаю только непосредственного родителя (адрес LEFT JOIN p.parent pp
), но не родителей, указанных выше. Например. $ node-> getParent () -> getParent ()
возвращает null
.
Что не так с моим кодом? Я неправильно понял ленивую загрузку?
Большое спасибо, Hacksteak