php - 使用 DQL 延迟加载 Doctrine2 和 Symfony2

标签 php symfony doctrine-orm

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

基本上我正在做一个 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

我的代码有什么问题?我是否误解了延迟加载?

非常感谢, 黑扒

最佳答案

您似乎正在使用 adjacency model用于将树存储在关系数据库中。这反过来意味着,您需要为每个级别连接一个查询来获取所有祖先。

因为您已经在使用 Doctrine Extension Library我建议看看Tree组件。

关于php - 使用 DQL 延迟加载 Doctrine2 和 Symfony2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8021579/

相关文章:

php - codeigniter 中的一次 HTTPS ajax 调用

php - 为什么 mysql_real_escape_string 返回 bool 值?

php - 过滤二维数组

php - Symfony2 : Two forms with a single controller (how to distinguish them with the name of the submit button)

php - 更正 Oracle 上的 Doctrine 日期时间

php - 用户照片库的 MySQL 设计

Symfony 2.7 + JMS 序列化器 + MaxDepth

Symfony2 路由 : import all controllers' annotations BUT exclude one (duplicated routes in NelmioApiDoc)

mysql - SQLSTATE[23000] 同时向 Doctrine 2 和 Symfony 2 添加 3 个实体

php - 学说 2 : Update Entity Using Table Schema