Magento Varien_Data_Collections:何时执行SQL查询

时间:2014-11-14 10:54:03

标签: database magento collections

我想知道Magento如何在varien_data_collections上内部处理数据库调用。例如:我的一个模型将数据集合返回给Block。其他where子句通过Layout XML块添加,然后附加到te model中返回的数据集合。

这是否意味着数据库调用两次?一个位于初始$model->getCollection()方法,另一个位于区块中的$collection->addFieldToFilter('x',array('eq'=>'y'))

或者Magento是否在iteraror上进行SQL调用?

请参阅下面的情况:

模特课程:

<?php

Class X_Y_Model_A extends Mage_Core_Model_Abstract{
    ...

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

?>

Block Class:

<?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;
    }

}

?>

布局XML文件

<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>

查看.phtml

<?php 
    // xy/related.phtml
    $_relatedItems = $this->getRelatedItems();

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

1 个答案:

答案 0 :(得分:0)

Magento使用延迟加载,只在真正需要来自结果集的数据时才执行查询。因此,只要您不使用结果,就可以在不真正执行查询的情况下继续添加条件或过滤器。