【问题标题】:filter doctrine nested set tree children hierarchy过滤学说嵌套集树子层次结构
【发布时间】:2015-09-17 22:57:42
【问题描述】:

我在我的应用程序中使用了一个学说嵌套集合树。

我可以使用

轻松检索整棵树
        $repo->childrenHierarchy(
            null, /* starting from root nodes */
            false, /* false: load all children, true: only direct */
            $options
        )

我想要的是根据外键过滤这棵树的实体(类别属于用户,所以每个类别都有一个 userId)

不幸的是,接受回调以过滤节点的选项不允许过滤外键,外键值不包含在节点数组中:

    $options = array(
        'decorate'  => true,
        'rootOpen'  => '<ul>',
        'rootClose' => '</ul>',
        'childOpen' =>  function ($node) use($user) {
            // $node does not contain any foreign key
            if ($node['userId'] != $user->getId()) {
                return null;
            }
            return "<li id='".$node['id']."'>";
        },
        'childClose' => '</li>',
    );

我该如何解决这个问题?

【问题讨论】:

    标签: symfony doctrine-orm tree doctrine nested


    【解决方案1】:

    我终于找到了解决方案,您必须在实体的存储库中创建一个新的自定义方法,并使用您自己的过滤器扩展原始 queryBuilder,如下所示:

    public function getTree()
    {
        $qb = $this->getNodesHierarchyQueryBuilder();
        $qb
            ->andWhere('node.status = :status')
            ->setParameter('status', 1)
            ->andWhere('node.deletedAt IS NULL')
        ;
    
        $aComponents = $qb->getQuery()->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
    
        return $this->buildTreeArray($aComponents);
    }
    

    最后,调用 buildTreeArray 方法来创建树结构。

    【讨论】:

      猜你喜欢
      • 2015-03-21
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多