2012-07-10 25 views
10

Tôi có một phương thức trợ giúp trong Magento, yêu cầu tôi lấy số lượng bộ sưu tập không liên quan. Ngoài ra, tôi cần thông tin này cho từng sản phẩm trong một danh mục, nghĩa là đối với từng sản phẩm trong chế độ xem danh sách sản phẩm. Vì vậy, tôi sẽ có khả năng tạo nhiều bộ sưu tập liên tục trong khi hiển thị danh sách sản phẩm.Magento - Phương pháp hiệu quả nhất để nhận số lượng bộ sưu tập

Phương pháp hiệu quả nhất để nhận số lượng bộ sưu tập là gì, tôi không cần bất kỳ dữ liệu nào từ các mô hình, chỉ đơn giản là có bao nhiêu mô hình.

là nó chỉ đơn giản:

Mage::getResourceModel('mymodule/mymodel_collection')->addFilter('myattribute', $value)->count() 

Hoặc là có một cách hiệu quả hơn để làm điều này?

Trả lời

-13

Câu hỏi rất hay. Từ những gì tôi tìm thấy trong mã nguồn, đây là lựa chọn nhanh nhất, mặc dù nó sau trong Varien_Data_Collection:

public function count() 
{ 
    $this->load(); 
    return count($this->_items); 
} 

Vì vậy, nó không điều bình thường của nó và đi về phía trước và tải bất cứ điều gì mà bạn chỉ định, giống như nó sẽ làm gì nếu bạn lặp lại các mục riêng lẻ. Không có phép thuật SQL COUNT() ở đây. Các phương pháp khác duy nhất tôi đã tìm thấy rằng có một cái gì đó để làm với đếm sản phẩm là getSelectCountSql()getProductCountSelect(), nhưng họ chỉ trả lại mã SQL.

Nhưng: toàn bộ điều EAV và trình tạo truy vấn của Magento rất thông minh, do đó không nên là rằng lớn đối với một giao dịch. Ngoài ra, tôi sẽ đặt cược rằng Magento có tất cả các loại bộ nhớ đệm đang diễn ra.

Vì vậy, trong ngắn hạn: có, đó là tùy chọn nhanh nhất để đếm số lượng sản phẩm trong bộ sưu tập sản phẩm.

+5

-1: Đây không phải là nhanh nhất. Ngược lại là trường hợp. Trên các bộ sưu tập lớn, điều này chỉ làm hỏng PHP do giới hạn bộ nhớ, do đó, nó mất đến một lượng thời gian vô hạn hơn so với phương thức 'getSize()'. – hakre

1

Hãy thử như:

$collection = Mage::getResourceModel('mymodule/mymodel_collection')->addFieldFilter('myattribute', $value); 
$collection->count(); 
//or 
$collection->getSize(); 
64

Đối đếm các mục theo một bộ sưu tập, sử dụng getSize() phương pháp:

$collection->getSize(); 

Never sử dụng php count() chức năng hoặc count() phương pháp của bộ sưu tập như này:

count($collection) 
$collection->count() 

Khi bạn sử dụng hàm/phương pháp count(), Magento tải tất cả các mục của bộ sưu tập từ cơ sở dữ liệu. Về bộ sưu tập lớn bạn sẽ có một sử dụng bộ nhớ khổng lồ và có thể là các vấn đề như Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 71 bytes) ...

+1

Đồng ý! Cảm ơn cho tip, FLOZz! Đừng bao giờ sử dụng count(). Khi làm việc với hàng nghìn mục trong bộ sưu tập, việc sử dụng count() có thể khiến cửa hàng của bạn gặp sự cố. Tôi phát hiện ra một cách khó khăn.. – awaage

+0

mẹo nhỏ của FLOZz –

-1
/** 
    * Retrieve collection all items count 
    * 
    * @return int 
    */ 
    public function getSize() 
    { 
     $this->load(); 
     if (is_null($this->_totalRecords)) { 
      $this->_totalRecords = count($this->getItems()); 
     } 
     return intval($this->_totalRecords); 
    } 

nên getSize() là không hiệu quả hơn.

+1

Có lẽ bạn nên giải thích mã của mình nhiều hơn một chút. Bạn đang xem tệp gì? Tôi không thấy chức năng như vậy ở bất cứ đâu trong thư mục ứng dụng trong phiên bản 1.7. –

+1

Xin lỗi nhưng điều này không đúng, vui lòng xem các chỉ số hiệu suất bên dưới: Sử dụng số(): 2014-07-07T12: 27: 04 + 00: 00 DEBUG (7): Thời gian thực hiện: 0.4933660030365 Sử dụng getSize (): 2014-07-07T12: 28: 56 + 00: 00 DEBUG (7): Thời gian thực hiện: 0.22210693359375 Như bạn có thể thấy, getSize() hiệu quả hơn đáng kể. – evensis

+0

'public function getSize() {...; $ this -> _ totalRecords = $ this-> getConnection() -> fetchOne ($ sql, $ this -> _ bindParams); ...; trả về intval ($ this -> _ totalRecords); } ' không biết bạn đã lấy mã của bạn ở đâu, nhưng đây là mã được sử dụng cho hầu hết các công cụ trong' lib/Varien/Data/Collection/Db.php', và đó là một số sql 'select count (. ..) từ ...; 'truy vấn, vì vậy rõ ràng là nhanh hơn. – user3338098

0

Dưới đây là cách hiệu quả nhất để làm điều này, bằng cách sử dụng được xây dựng trong các phương pháp Magento:

$ids = Mage::getModel('catalog/product') 
       ->getCollection() 
       ->addAttributeToSelect('entity_id') 
       ->addFieldToFilter('status', array('eq'=>'1')) 
       ->addFieldToFilter('visibility', array('eq'=>'4')) 
       ->addFieldToFilter('type_id', array('in'=>array('simple'))) 
       ->getAllIds(); 
     var_dump(count($ids)); 
Các vấn đề liên quan