컬렉션에서 모든 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
[...]

addAttributeToSelect왜냐하면 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.