Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
For loop发出3600个数据库请求以加载产品。PHP_Php_Magento - Fatal编程技术网

For loop发出3600个数据库请求以加载产品。PHP

For loop发出3600个数据库请求以加载产品。PHP,php,magento,Php,Magento,问题:有一个问题(我们目前可以确定)是,在加载较长的产品列表时,客户机产品列表会多次(3600次)调用数据库 代码: 在for循环中不应该有数据库查询调用。您需要在开始时构建一个查询,以获取for循环之前所需的所有数据 我能看到的一些即时指针是: $grand_child_show = Mage::getModel('catalog/category')->load($grand_child->getId()); if ($grand

问题:有一个问题(我们目前可以确定)是,在加载较长的产品列表时,客户机产品列表会多次(3600次)调用数据库

代码:



在for循环中不应该有数据库查询调用。您需要在开始时构建一个查询,以获取for循环之前所需的所有数据

我能看到的一些即时指针是:

$grand_child_show = Mage::getModel('catalog/category')->load($grand_child->getId());
                        if ($grand_child_show->getShowSidebar() == 1) {
                            $url = Mage::getModel('catalog/category')->load($grand_child_show->getId())->getURL();
这是在无缘无故地调用数据库两次,您应该能够执行以下操作:

 $grand_child_show = Mage::getModel('catalog/category')->load($grand_child->getId());
                            if ($grand_child_show->getShowSidebar() == 1) {
                                $grand_child_show->getURL();
如果在脚本开始时调用以下函数,则应该能够删除所有这些“GetModel”函数:

$all_grand_children = Mage::getModel('catalog/category')->getAllCategories();
这将返回一个散列数组,通过在for循环中执行以下操作,您可以访问该散列数组中的相关项:

$grand_children = $all_grand_children[$subcat->getId()];
这将取代

$grand_children = Mage::getModel('catalog/category')->getCategories($subcat->getId());

您还应该对所有grand_child和cat_show对象进行初始调用。如果您精通SQL,您可以通过在一个SQL查询中连接表来调用相关信息。

不用担心!如果你有任何问题,请告诉我!我绝对会的!再次感谢你@jodran121sa如果可能的话,你能告诉我你将如何实施这个吗?
$grand_children = Mage::getModel('catalog/category')->getCategories($subcat->getId());