Tüm kimlik numaralarını koleksiyondan almanın en etkili yolu


37

Geçmişte, bir ürün koleksiyonunun tüm kimliklerini almak getAllIdsiçin, koleksiyonda her zaman kullandım , bunun verilerin toplanmasıyla tam olarak yüklenmesini engelleyen bir yöntem olduğuna inanıyordum.

Ancak, bugün yönteme baktım ve koleksiyonu yüklüyor ve ID dizisini almak için her öğenin üzerinde yineleniyor.

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

Sorum şu ki, koleksiyondan yalnızca kimlik alanını almak için en etkili yöntem nedir?

Yanıtlar:


43

Aslında getAllIdsbunu yapmanın en iyi yolu. Örneğin, ürün toplama kaynak modelinde yöntem şöyle görünür:

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

Böylece her şey tek bir seçimden alınır ve yineleme gerekmez. Ayrıca soyut kaynak modelinde şöyle görünür:

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

Dolayısıyla, uzayan her şey, Mage_Core_Model_Resource_Db_Collection_Abstractaksi belirtilmediği sürece bunu kullanmalıdır.

Baktığınız yöntem temel sınıftan geliyor Varien_Data_Collectionancak çocuklarının üzerine yazılıyor.


6

Bu durumda toplama nesnesini kullanabilirsiniz.

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

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

addAttributeToSelectiçin entity_idgerçekten gerekli ama koydum amaçları göstermek için, sana ihtiyacım alanları eklemek ve bitirdiniz değil!

Bu Wikipage'de bulabileceğiniz koleksiyonlarla ilgili daha fazla bilgi


3

Daha Optimize

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

Bu da varsayılan olarak yapılır ... bkz $this->_getClearSelect().
sv3n,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.