Knp DoctrineBehaviors Tree getChildNodes

时间:2014-03-29 22:05:38

标签: php symfony tree

我正在学习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;  
}  

感谢您的帮助。

1 个答案:

答案 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

的更多信息