从集合中获取所有ID的最有效方法


37

过去获取产品集合的所有ID时,我一直getAllIds在该集合上使用,因为我认为这是一种方法,它会阻止数据等的全部收集工作。

但是,实际上我今天看了一下这个方法,它加载了集合并遍历每个项目以获取ID数组。

public function getAllIds()
{
    $ids = array();
    foreach ($this->getItems() as $item) {
        $ids[] = $this->_getItemId($item);
    }
    return $ids;
}

我的问题是,从集合中仅检索ID字段的最有效方法是什么?

Answers:


43

实际上,这getAllIds是最好的方法。例如,在产品集合资源模型中,方法如下所示:

public function getAllIds($limit = null, $offset = null)
{
    $idsSelect = $this->_getClearSelect();
    $idsSelect->columns('e.' . $this->getEntity()->getIdFieldName());
    $idsSelect->limit($limit, $offset);
    $idsSelect->resetJoinLeft();

    return $this->getConnection()->fetchCol($idsSelect, $this->_bindParams);
}

因此,所有内容都可以从一个选择中检索出来,并且不需要迭代。同样在抽象资源模型中,它看起来像这样:

public function getAllIds()
{
    $idsSelect = clone $this->getSelect();
    $idsSelect->reset(Zend_Db_Select::ORDER);
    $idsSelect->reset(Zend_Db_Select::LIMIT_COUNT);
    $idsSelect->reset(Zend_Db_Select::LIMIT_OFFSET);
    $idsSelect->reset(Zend_Db_Select::COLUMNS);

    $idsSelect->columns($this->getResource()->getIdFieldName(), 'main_table');
    return $this->getConnection()->fetchCol($idsSelect);
}

因此,Mage_Core_Model_Resource_Db_Collection_Abstract除非另有说明,否则扩展的所有内容均应使用此功能。

您查看的方法来自基类,Varien_Data_Collection但在其子代中被覆盖。


6

在这种情况下,您可以使用集合对象

$collection = Mage::getModel('catalog/product')->getCollection()
   ->addAttributeToSelect('entity_id');

[...] 
do your loop
[...]

addAttributeToSelectfor entity_id并不是真正必需的,但出于演示目的,我将其放入其中,添加您需要的字段,您就完成了!

您可以在此Wikipage上找到更多关于馆藏的信息


3

更优化

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->getSelect()->reset(Zend_Db_Select::COLUMNS);
$collection->getSelect()->columns('entity_id');
$collection1Ids[] = $collection->getAllIds();

这也是默认情况下完成的$this->_getClearSelect()
sv3n
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.