我正在使用Symfony 2.8与学说2.4
我有一个具有一对多的自我引用协会映射的实体
entity:
id
name
parent_id
示例:
id: 1
name: A
parent_id: null
id: 2
name: B
parent_id = 1
id: 3
name: C
parent_id = 2
id: 4
name: D
parent_id = 3
我写了一个函数,可以找到父母的所有嵌套子女。
public function getAllChildrenIdRecursively($entity)
{
$result = array();
if (count($entity->getChildren()) > 0) {
$result[] = $entity->getId();
foreach ($entity->getChildren() as $child) {
$result = array_merge($result, $this->getAllChildrenIdRecursively($child)) ;
}
}
return $result;
}
如果我称此功能为GetallChildRenidRecursrecursal(2(,那么我将获得3,4。
此功能工作起作用,但我的问题是它在DB中生成了太多的查询,该查询需要将近1.5秒 .Query生成2500以上,总结果= 2600和总行= 5000
如何减少查询时间?
任何帮助将不胜感激!谢谢
在您的孩子实施的情况下,您没有解决方案来有效地优化代码。您必须更改实施方式,以使所有孩子和子儿童只需要一个请求。树木实施是一个更好的解决方案,因为有了一个SQL请求,您可以捕获所有孩子,而另一个孩子可以拥有所有父母等。
。我认为您应该看看这个出色的树理论扩展,以避免递归。如果您仅在学说2.4中,请测试2.3扩展版本。
<?php
namespace Entity;
use GedmoMappingAnnotation as Gedmo;
use DoctrineORMMapping as ORM;
/**
* @GedmoTree(type="nested")
* @ORMTable(name="categories")
* use repository for handy tree functions
* @ORMEntity(repositoryClass="GedmoTreeEntityRepositoryNestedTreeRepository")
*/
class Category
{
/**
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue
*/
private $id;
/**
* @ORMColumn(name="title", type="string", length=64)
*/
private $title;
/**
* @GedmoTreeLeft
* @ORMColumn(name="lft", type="integer")
*/
private $lft;
/**
* @GedmoTreeLevel
* @ORMColumn(name="lvl", type="integer")
*/
private $lvl;
/**
* @GedmoTreeRight
* @ORMColumn(name="rgt", type="integer")
*/
private $rgt;
/**
* @GedmoTreeRoot
* @ORMManyToOne(targetEntity="Category")
* @ORMJoinColumn(name="tree_root", referencedColumnName="id", onDelete="CASCADE")
*/
private $root;
/**
* @GedmoTreeParent
* @ORMManyToOne(targetEntity="Category", inversedBy="children")
* @ORMJoinColumn(name="parent_id", referencedColumnName="id", onDelete="CASCADE")
*/
private $parent;
/**
* @ORMOneToMany(targetEntity="Category", mappedBy="parent")
* @ORMOrderBy({"lft" = "ASC"})
*/
private $children;
public function getId()
{
return $this->id;
}
public function setTitle($title)
{
$this->title = $title;
}
public function getTitle()
{
return $this->title;
}
public function getRoot()
{
return $this->root;
}
public function setParent(Category $parent = null)
{
$this->parent = $parent;
}
public function getParent()
{
return $this->parent;
}
}