原则2:根据自引用实体构建嵌套的数组树

问题描述

|| 我有一个看起来像这样的实体:
class Privilege
{
/**
 * @Id @Column(type=\"bigint\")
 * @GeneratedValue(strategy=\"AUTO\")
 */
private $id;

/**
 * @Column(type=\"string\",length=255)
 */
private $name;

/**
 * @Column(type=\"string\",length=255)
 */
private $slug;

/**
 * @OneToMany(targetEntity=\"Privilege\",mappedBy=\"parent\")
 */
private $children;

/**
 * @ManyToOne(targetEntity=\"Privilege\",inversedBy=\"children\")
 * @JoinColumn(name=\"p_id\",referencedColumnName=\"id\")
 */
private $parent;
如果
Privilege Entity
没有父母,则该字段为NULL。我有一个像这样的基本查询:
    $qb = $this->em->createQueryBuilder()
        ->select(\'p\')
        ->from(\'\\Dashboard\\Entity\\Privilege\',\'p\')
        ->andWhere(\'p.parent IS NULL\');

    $q = $qb->getQuery();
    $privileges = $q->getResult();
我希望从此方法返回的数组结果看起来与此类似:
root1:
    child1:
        subchild1a
        subchild2a
   child2:
        subchild1b
        subchild2b
        subchild3b
            subsubchild1b
   child3:
        subchild1c
root2:
....
....
有没有办法将Doctrine 2的结果水合,从而以这种方式构建数组结果?如果没有,您将如何构建该数组?我仍在玩教义2,我注意到我的
$privileges
数组中的每个元素都有一个
$privilege->getChildren()
,它返回了
PersistentCollection
,显然不是实际记录。 如果我必须自己构建此嵌套树(即:在Doctrine中没有内置方法可以做到),如何将返回的
PersistentCollection
转换为实际数据,以便为我构建某种递归方法来构建它?我正在查看文档,但显然在错误的位置。     

解决方法

        结果已经在嵌套树中。
PersistentCollection
可以像数组一样进行迭代:
foreach($parent->getChildren() as $child) {
    // $child is an instance of Privilige
}
仍然应该尝试
$privileges = $q->getArrayResult();
,看看是否能得到想要的结果。     ,        我认为您正在寻找的文档中称为“一对多自引用协会”:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference /association-mapping.html#one-to-one-self-referencing 以下是文档中类别层次结构的代码:
<?php
/** @Entity **/
class Category
{
    // ...
    /**
     * @OneToMany(targetEntity=\"Category\",mappedBy=\"parent\")
     **/
    private $children;

    /**
     * @ManyToOne(targetEntity=\"Category\",inversedBy=\"children\")
     * @JoinColumn(name=\"parent_id\",referencedColumnName=\"id\")
     **/
    private $parent;
    // ...

    public function __construct() {
        $this->children = new \\Doctrine\\Common\\Collections\\ArrayCollection();
    }
}
“这有效地建模了类别的层次结构,从数据库的角度来看,这被称为邻接表方法。” 因此,我认为这应该为您完成所有工作,并创建所需的数组层次结构。 由于您已经像在文档中那样具有注释,因此@rojoca表示,您的
$parent->getChildren()
应该已经包含了所有层次结构。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...