PHP递归功能性能优化



我正在使用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;
    }
}

相关内容

  • 没有找到相关文章

最新更新