gpt4 book ai didi

php - 在 Symfony2 中显示目录太慢

转载 作者:搜寻专家 更新时间:2023-10-31 20:37:17 25 4
gpt4 key购买 nike

我正在开发一个应用程序,该应用程序的产品目录带有 n 级类别树。

我有下一个结构:

Category 1
--Category 1.1
----Category 1.1.1
------Product 1.1.1.1
------Product 1.1.1.2
----Product 1.1.1
--Category 1.2
----Product 1.2.1
--Product 1.1

我需要类似平面阵列的东西:

Category 1
Category 1.1
Category 1.1.1
Product 1.1.1.1
Product 1.1.1.2
Product 1.1.1
Category 1.2
Product 1.2.1
Product 1.1

但问题是我需要太多的查询和太多的时间来生成它(我有 700 个产品和 200 个类别,大约需要 846 个查询和 2100 毫秒来执行它们)。我可以添加更多连接,但执行时间会显着增加。我正在使用可翻译实体。

有什么想法可以最大程度地减少查询次数和执行时间吗?品类既有自身关系,也有与产品的关系。

我认为一个选项可以是获取所有类别并制作一个有序树,然后再次重做平面数组,但我不知道这是否是最佳选择...

提前感谢您的帮助!

编辑:这是我生成“平面”数组的函数。

public function generateCategoriesTree($categories, $result = array()) {
$tempResult = array();
if(count($categories)) {
foreach($categories as $k => $v) {
$tempResult[] = $v;
if(count($v->getCategories())) {
$temp = $this->generateCategoriesTree($v->getCategories(), $result);
foreach($temp as $kk => $vv) {
$tempResult[] = $vv;
}
}
}
}

return array_merge($result, $tempResult);
}

但问题不在这里,问题是当我尝试访问树的第二层时,当调用方法 getcategories 时,在数据库中执行查询。

更新

通过这个解决方案,我将查询数量从 700 减少到 100,并将执行时间从 2100 毫秒减少到 350 毫秒。我认为现在就足够了,因为这个操作每小时使用几次。

if ($this->isGranted('ROLE_EMPLOYEE') || $currentUser->isXXXXXXSeller()) {
$XXXXXXCategories = $em->getRepository('CatalogBundle:Category')->getMainCategoriesByBrand(1);
if(is_array($XXXXXXCategories)) {
$categoriesXXXXXX = $this->get('core_tools')->generateCategoriesTree($XXXXXXCategories);
$categories = new ArrayCollection(
array_merge($categories->toArray(), $categoriesXXXXXX)
);
}
}
$categoriesToShow = array();
$products = $em->getRepository('CatalogBundle:Product')->getAllOrderedByPosition();
if(is_array($products) && is_array($categories)) {
foreach($categories as $category) {
$categoriesToShow["c_".$category->getId()] = array(
"category" => $category,
"products" => array(),
);
}
foreach($products as $product) {
if($product->getCategories()) {
foreach($product->getCategories() as $productCategory) {
if(array_key_exists("c_".$productCategory->getCategory()->getId(), $categoriesToShow)) {
$categoriesToShow["c_".$productCategory->getCategory()->getId()]['products'][] = $product;
}
}
}
}
}

最佳答案

如果目录不经常更改(即:超过每隔几秒更改一次)- 然后进行一次艰苦的工作,然后缓存输出以备立即使用。

目录更改时 - 重建缓存。

关于php - 在 Symfony2 中显示目录太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32045289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com