Doctrine 2 嵌套集 - 在单个查询中检索完整的树
Doctrine 2 nested set - retrieve full tree in single query
我正在使用 stof/StofDoctrineExtensionsBundle (Bundle wrapper for Atlantic18/DoctrineExtensions) 来实现嵌套集(树)实体。该实体已配置并正常工作,但我无法弄清楚如何在单个查询中检索所有根注释及其所有子项(完整树)。我目前返回了完整的集合,但是它延迟加载了所有子项,这意味着执行了大量查询。
感谢您的帮助。
找到解决方案。
检索节点的完整列表objects:
$repo = $this->getDoctrine()->getManager()->getRepository('NestedEntity');
$nodes = $repo->getChildren();
用你的节点构建树。
$tree = $repo->getRepoUtils()->buildTreeArray($nodes);
buildTreeArray 方法接受 node-arrays 的数组,因此您必须在实体中实现 ArrayAccess 接口。它还将所有 children 放入 node-array.
的 __children
键中
/**
* @Gedmo\Tree(type="nested")
* @ORM\Table(name="nested_entity")
* @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
*/
class NestedEntity implements \ArrayAccess
{
public function offsetExists($offset)
{
return property_exists($this, $offset);
}
public function &offsetGet($offset)
{
return $this->$offset;
}
public function offsetSet($offset, $value)
{
$this->$offset = $value;
}
public function offsetUnset($offset)
{
$this->$offset = null;
}
protected $__children = [];
...
您可以只使用 childrenHierarchy()
方法来检索整棵树:
$tree = $repo->childrenHierarchy();
我正在使用 stof/StofDoctrineExtensionsBundle (Bundle wrapper for Atlantic18/DoctrineExtensions) 来实现嵌套集(树)实体。该实体已配置并正常工作,但我无法弄清楚如何在单个查询中检索所有根注释及其所有子项(完整树)。我目前返回了完整的集合,但是它延迟加载了所有子项,这意味着执行了大量查询。
感谢您的帮助。
找到解决方案。
检索节点的完整列表objects:
$repo = $this->getDoctrine()->getManager()->getRepository('NestedEntity'); $nodes = $repo->getChildren();
用你的节点构建树。
$tree = $repo->getRepoUtils()->buildTreeArray($nodes);
buildTreeArray 方法接受 node-arrays 的数组,因此您必须在实体中实现 ArrayAccess 接口。它还将所有 children 放入 node-array.
的__children
键中/** * @Gedmo\Tree(type="nested") * @ORM\Table(name="nested_entity") * @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository") */ class NestedEntity implements \ArrayAccess { public function offsetExists($offset) { return property_exists($this, $offset); } public function &offsetGet($offset) { return $this->$offset; } public function offsetSet($offset, $value) { $this->$offset = $value; } public function offsetUnset($offset) { $this->$offset = null; } protected $__children = []; ...
您可以只使用 childrenHierarchy()
方法来检索整棵树:
$tree = $repo->childrenHierarchy();