コレクションからすべてのIDを取得する最も効率的な方法


37

過去には、製品コレクションのすべてのIDを取得するために、これをコレクションで常に使用getAllIdsしていました。これは、データなどを含むコレクションの完全なロードを妨げる方法だと信じていました。

しかし、私は実際に今日メソッドを見て、コレクションをロードし、各アイテムを反復処理してID配列を取得しました。

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

私の質問は、コレクションからIDフィールドのみを取得する最も効率的な方法は何ですか?

回答:


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は実際には必須ではありませんが、デモンストレーションのために必要なフィールドを追加すれば完了です。

このWikiページにあるコレクションの詳細


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.