的Symfony /嫩枝 - 递归下降的数据库查询

我在树枝模板我的类别树:的Symfony /嫩枝 - 递归下降的数据库查询

{% for category in categories %} 

<li>

<div class="li"><a href="{{ path('accessories_list', { 'category' : category.url }) }}">{{ category.name|trans({}, 'categories')|raw }}</a></div>

{% if category.children is not empty %}

<ul>

{% include "default/_menu_links.html.twig" with {'categories':category.children} only %}

</ul>

{% endif %}

</li>

{% endfor %}

它创建+ - 53个数据库查询,如果我有6类,并在每个单一类别7小类。

有没有办法减少这个数字? 我在doctrine中使用useResultCache(true),但看起来它不是从缓存中加载(至少不是在开发模式下)。

你如何处理类别树?

UPDATE: 实体:

... 

/**

* One Category has Many Subcategories.

* @ORM\OneToMany(targetEntity="Category", mappedBy="parent", cascade={"persist"}))

*/

private $children;

/**

* Many Subcategories have One Category.

* @ORM\ManyToOne(targetEntity="Category", inversedBy="children", cascade={"persist"})

* @ORM\JoinColumn(name="parent_id", referencedColumnName="id")

*/

private $parent;

...

/**

* Add child

*

* @param \App\Entity\Product\Category $child

*

* @return Category

*/

public function addChild(\App\Entity\Product\Category $child): Category

{

$this->children[] = $child;

return $this;

}

/**

* Remove child

*

* @param \App\Entity\Product\Category $child

*/

public function removeChild(\App\Entity\Product\Category $child)

{

$this->children->removeElement($child);

}

/**

* Get children

*

* @return \Doctrine\Common\Collections\Collection

*/

public function getChildren(): Collection

{

return $this->children;

}

/**

* Set parent

*

* @param \App\Entity\Product\Category $parent

*

* @return Category

*/

public function setParent(\App\Entity\Product\Category $parent = null): Category

{

$this->parent = $parent;

return $this;

}

/**

* Get parent

*

* @return \App\Entity\Product\Category

*/

public function getParent()

{

return $this->parent;

}

...

回答:

根据我的意见:你有你的JOIN子类别。我假设您目前正在做这样的事情来检索您的categories

public function getCategories() 

{

return $this->getEntityManager()->createQueryBuilder()

->select("category")

->from("App:Category", "category")

->where("category.parent IS NULL")

->getQuery()->getResult();

}

所以,如果你现在遍历数组类,并试图访问children财产,子查询将为每个发射导致这种大量数据库查询的孩子。

相反,你应该JOIN他们是这样的:

public function getCategories() 

{

return $this->getEntityManager()->createQueryBuilder()

->select("category", "subcat")

->from("App:Category", "category")

->leftJoin("category.children", "subcat")

->where("category.parent IS NULL")

->getQuery()->getResult();

}

如果你现在遍历您categories并访问children财产,没有多余的查询将被解雇了!

使用上面的查询,这个片段在树枝将导致只在一个数据库查询:

{% for category in categories %} 

<p>cat={{ category.id }}</p>

{% for subcat in category.children %}

<p>subcat={{ subcat.id }}</p>

{% endfor %}

<hr>

{% endfor %}

以上是 的Symfony /嫩枝 - 递归下降的数据库查询 的全部内容, 来源链接: utcz.com/qa/259464.html

回到顶部