Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.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
Database Magento Varien_数据收集:何时执行SQL查询_Database_Magento_Collections - Fatal编程技术网

Database Magento Varien_数据收集:何时执行SQL查询

Database Magento Varien_数据收集:何时执行SQL查询,database,magento,collections,Database,Magento,Collections,我想知道Magento如何在内部处理varien_数据收集上的数据库调用。例如:我的一个模型将数据收集返回到块。通过布局XML块添加额外的where子句,然后将其附加到从te模型返回的数据集合中 这是否意味着数据库调用要进行两次?一个在初始$model->getCollection方法上,一个在块中的$collection->addFieldToFilter'x',array'eq'=>y'上 还是Magento对iteraror进行SQL调用 见下面我的情况: 模型类: 块类: 布局XML文件

我想知道Magento如何在内部处理varien_数据收集上的数据库调用。例如:我的一个模型将数据收集返回到块。通过布局XML块添加额外的where子句,然后将其附加到从te模型返回的数据集合中

这是否意味着数据库调用要进行两次?一个在初始$model->getCollection方法上,一个在块中的$collection->addFieldToFilter'x',array'eq'=>y'上

还是Magento对iteraror进行SQL调用

见下面我的情况:

模型类:

块类:

布局XML文件

视图.phtml


Magento使用延迟加载,仅当它确实需要来自resultset的数据时才执行查询。因此,只要不使用结果,就可以继续添加条件或筛选器,而不必真正执行查询。

因此,基本上这意味着在模板中调用for循环之前,不会执行查询?嗯。。。不完全是。。。一旦需要从结果中得到一些东西。在很多情况下,这是在结果集上的迭代一开始。例如,在循环之前需要返回元素的数量,例如用于分页等目的时,情况并非如此
<?php

Class X_Y_Model_A extends Mage_Core_Model_Abstract{
    ...

    public function getRelatedItems(){
        return $this->getCollection()
            ->addFieldtoFilter('id',array('eq'=>$this->getId()));
    }
}

?>
<?php

Class X_Y_Block_A extends Mage_Core_Block_Template{

    private $limit = 5;

    public function setDbLimit($limit){
        $this->limit = (int)$limit;
        return $this;
    }

    public function getDbLimit(){
        return $this->limit;
    }

    public function getRelatedItems(){
        $_collection = Mage::getModel('xy/a')->getRelatedItems();
        $_collection->setPageSize($this->getDbLimit());
        return $_collection;
    }

}

?>
<layout>
    ...
    <reference name="content">
        <block type="xy/a" name="xy" as="xy" template="xy/related.phtml">
            <action method="setDbLimit"><limit>2<limit></action>
        </block>
    </reference>
</layout>
<?php 
    // xy/related.phtml
    $_relatedItems = $this->getRelatedItems();

    if($_relatedItems->getSize()>0){
        foreach($_relatedItems as $_relatedItem){
            // HTML Output
        }
    }
?>