我正在使用Symfony2.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我编写了一个函数,该函数查找父级的所有嵌套子id。
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;
}如果我调用这个函数getAllChildrenIdRecursively(2),那么我将得到3,4。
这个函数正在工作,但是我的问题是它在DB中生成了太多的查询,花费了将近1.5秒--.Query生成的查询超过2500,总结果= 2600,总行= 5000
如何减少查询时间?
任何帮助都将不胜感激!谢谢
发布于 2019-05-12 11:25:06
对于您的子实现,您没有有效优化代码的解决方案。您必须更改您的实现,以便只使用一个请求对所有的子级和子级进行检查。树实现是一个更好的解决方案,因为使用一个SQL请求,您可以捕获所有的子级,而另一个则可以捕获所有的父级,等等。
我认为您应该看看这个优秀的树形理论扩展,以避免递归。如果您只在原则2.4中,测试2.3扩展版本。
<?php
namespace Entity;
use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;
/**
* @Gedmo\Tree(type="nested")
* @ORM\Table(name="categories")
* use repository for handy tree functions
* @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
*/
class Category
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue
*/
private $id;
/**
* @ORM\Column(name="title", type="string", length=64)
*/
private $title;
/**
* @Gedmo\TreeLeft
* @ORM\Column(name="lft", type="integer")
*/
private $lft;
/**
* @Gedmo\TreeLevel
* @ORM\Column(name="lvl", type="integer")
*/
private $lvl;
/**
* @Gedmo\TreeRight
* @ORM\Column(name="rgt", type="integer")
*/
private $rgt;
/**
* @Gedmo\TreeRoot
* @ORM\ManyToOne(targetEntity="Category")
* @ORM\JoinColumn(name="tree_root", referencedColumnName="id", onDelete="CASCADE")
*/
private $root;
/**
* @Gedmo\TreeParent
* @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="CASCADE")
*/
private $parent;
/**
* @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
* @ORM\OrderBy({"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;
}
}https://stackoverflow.com/questions/56096663
复制相似问题