如何解决原则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()
应该已经包含了所有层次结构。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。