Cách hiệu quả nhất để lấy tất cả ID từ bộ sưu tập


37

Trước đây để có được tất cả ID của bộ sưu tập sản phẩm, tôi luôn sử dụng getAllIdsbộ sưu tập này, tin rằng đây là phương pháp ngăn chặn toàn bộ tải bộ sưu tập với dữ liệu, v.v.

Nhưng, tôi thực sự đã xem xét phương thức ngày hôm nay và nó tải bộ sưu tập và lặp lại qua từng mục để lấy mảng ID.

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

Câu hỏi của tôi là, phương pháp hiệu quả nhất để chỉ lấy trường ID từ bộ sưu tập là gì?

Câu trả lời:


43

Thực sự getAllIdslà cách tốt nhất để làm điều đó. Ví dụ, trong mô hình tài nguyên bộ sưu tập sản phẩm, phương thức này trông như thế này:

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

Vì vậy, mọi thứ được lấy từ một lựa chọn duy nhất và không yêu cầu lặp lại. Cũng trong mô hình tài nguyên trừu tượng, nó trông như thế này:

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

Vì vậy, mọi thứ mở rộng Mage_Core_Model_Resource_Db_Collection_Abstractnên sử dụng điều này trừ khi có quy định khác.

Phương thức bạn nhìn vào xuất phát từ lớp cơ sở Varien_Data_Collectionnhưng nó được ghi đè lên trong các phần tử con của nó.


6

Trong trường hợp này, bạn có thể sử dụng đối tượng bộ sưu tập

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

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

addAttributeToSelectentity_idkhông thực sự cần thiết nhưng để thể hiện mục đích tôi đưa nó vào, hãy thêm các lĩnh vực bạn cần và bạn đã hoàn tất!

Thông tin thêm về các bộ sưu tập bạn sẽ tìm thấy trên Wikipage này


3

Tối ưu hóa hơn

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

Điều này cũng được thực hiện theo mặc định ... xem $this->_getClearSelect().
sv3n
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.