使用DQL延迟加载Doctrine2和Symfony2

hac*_*k25 37 php symfony doctrine-orm

我有一个父结构的树结构.目前我正在尝试让所有父节点显示当前节点的路径.

基本上我正在做一个while循环来处理所有节点.

$current = $node->getParent();
while($current) {
  // do something
  $current = $current->getParent();
}
Run Code Online (Sandbox Code Playgroud)

使用默认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();
}
Run Code Online (Sandbox Code Playgroud)

使用该代码,加载父项失败.我只得到直接的父母(由LEFT JOIN p.parent pp他们解决)而不是上面的父母.例如$node->getParent()->getParent()返回null.

我的代码有什么问题?我误解了延迟加载的东西吗?

非常感谢Hacksteak

mbh*_*mbh 7

看起来您正在使用邻接模型在关系数据库中存储树.这反过来意味着,您将需要每个级别的连接,以通过单个查询获得所有祖先.

由于您已经在使用Doctrine Extension Library,我建议您查看Tree组件.