我正在学习symfony,目前我正在研究Knp DoctrineBehaviors Tree,我感到很困惑,因为在特质:https://github.com/KnpLabs/DoctrineBehaviors/blob/master/src/Knp/DoctrineBehaviors/Model/Tree/Node.php中有一个$ childNodes和getter getChildNodes()有意义,但getChildNodes总是为我返回空数组,我同意这一点,因为我没有设置$ childNodes,所以它总会返回空的ArrayCollection。所以我的问题是我的应用程序应该照顾这个吗?或者我错误地指出了这一点?
/**
* @var ArrayCollection $childNodes the children in the tree
*/
private $childNodes;
...
...
...
/**
* {@inheritdoc}
**/
public function getChildNodes()
{
return $this->childNodes = $this->childNodes ?: new ArrayCollection;
}
感谢您的帮助。
答案 0 :(得分:1)
是的,您需要设置子节点。但这样做的api如下:
//To set $child as child node for a $parent entity
$child->setParentNode($parent);
//OR
$child->setChildOf($parent);
$parent->isParentOf($child); //return true
$child->isParentOf($parent); //return false
每当您需要访问getChildNodes()时,您需要首先构建树:
$root = $em->getRepository('Category')->getTree();
$root->getParent(); // null
$root->getChildNodes(); // ArrayCollection
$root[0][1]; // node or null
$root->isLeaf(); // boolean
$root->isRoot(); // boolean
这个树实现背后的想法是父和子(外键)之间没有关系。所有关系都是通过物化路径定义的,存储在每个节点中的字符串。因此,在构建树之前,您无法访问此getParentNode()
和getChildNodes()
函数。
仅供您考虑:要通过parent_id获取所有子项,您可以在存储库中定义以下函数
public function getChildrenByParentID($parentId)
{
$parentPath = $this->find($parentId)->getRealMaterializedPath();
return $this->getTree($parentPath)->getChildNodes();
}
更新:您可以使用以下函数(在您的存储库类中定义)来读取所有根级别节点:
public function getRootLevelNodes()
{
$qb = $this->createQueryBuilder('t');
return $qb
->where($qb->expr()->eq('t.materializedPath', '?1'))
->setParameter(1, '');
}
您可以阅读有关Doctrine ORM behaviors, or how to use traits efficiently
的更多信息