0

我有变量 $path ,其中包含同级类别名称的数组。使用这个变量,我想创建一个新的数组 $categories_children,它将根据其标题包含 $path 数组中每个类别的子数组。我正在使用Gediminas Morkevicius的 Doctrine Tree-Nestedset扩展,我已经尝试过:

    $em = $this->getDoctrine()->getManager();
    $repo = $em->getRepository('MyProjectAdminBundle:Category');

    $category = $repo->findOneById($id);       
    $path = $repo->getPath($category);

    $categories_children = array();

    foreach($path as $node){
        $parent = $repo->findOneByTitle($node);
        $categories_children[] = $repo->getChildren($parent, true);
    }

问题是带有参数 $parent 的方法 getChildren() 返回与传递的参数为 NULL 时相同的数组。这意味着它将返回所有以 root 开头的节点,而不是从所选类别开始。不知何故,在 $parent 变量中使用的方法 findOneByTitle() 不接受来自 getPath() 的参数并且表现为 NULL。

4

1 回答 1

0

getChildren$parent 参数仅指定从哪个根元素获取树。您可以childrenQueryBuilder在 中查看函数代码NestedTreeRepository

为了获取所有孩子,我在存储库中使用自己的函数。

public function getTreeAsFlatArray( AbstractTreeNode $parent = null, array $options = array() ) {
    $qb = $this->createQueryBuilder('node');    
    $qb
        ->andWhere('node.lft > :parent_lft')
            ->setParameter('parent_lft', $parent->getLft() )
        ->andWhere('node.lft < :parent_rgt')
            ->setParameter('parent_rgt', $parent->getRgt() )
        ->andWhere('node.level <= :level')
            ->setParameter('level', $parent->getLevel() + $o['depth'])
        ->andWhere('node.root = :root')
            ->setParameter('root', $parent->getRoot())
    ;

    ...
}   

如果您只需要直接子简单方法来指定实体中的子字段

/**
 * @ORM\OneToMany(targetEntity="AbstractTreeNode", mappedBy="parent", fetch="EXTRA_LAZY")
 * @ORM\OrderBy({"lft" = "ASC"})
 */
protected $childs;
于 2013-07-04T09:30:51.193 回答