답변:
당신은 정말로 사용해야합니다
Mage::getSingleton('core/resource_iterator')
언급 한 성능상의 이유로 순수하게 존재하기 때문에이 목적을 위해.
그렇지 않으면, 당신은 함께 루프를 사용하여 약간 덜 우아한 솔루션을 사용할 수있는 setPageSize
좋은 예제가 여기있다, - /programming/3786826/how-to-loop-a-magento-collection
setPageSize
시맨틱 하기 때문에 +1입니다 .
core/resource_iterator
사실은 솔루션이 실제로 mysql 쿼리를 페이지 매김하지 않는다는 것입니다. 전체 결과 세트를 한 번에로드하지만 PHP 코드에서 처리 할 수있는 행을 한 번에 제공합니다. 따라서 PHP 내에서 메모리 결함을 피할 수 있지만 결과 집합이 매우 큰 경우 mysql 최대 패킷 크기를 트리거합니다. 내가 사용하여 멋진 추상 청크 된 resource_iterator를 만들려고 생각합니다setPageSize()
Ben Lessani에 동의 하면 가능하면core/iterator
한 번에 한 행씩 큰 콜렉션을로드 하기 위해 자원 모델을 사용해야한다는 데 동의 합니다 .
그러나 한계가 있습니다. " addAttributeToSelect가 core / resource_iterator 와 함께 작동하지 않습니까? "에 설명 된대로 속성 값 테이블의 값을 포함해야하는 경우 EAV 모델에서 제대로 작동하지 않습니다.
그리고 StackOverflow의 링크 된 예제는 다른 LIMIT
표현식으로 동일한 쿼리를 반복하기 때문에 실제로 좋지 않습니다 . 복잡한 쿼리의 경우 이는 성능 문제 일 수 있지만, 더 중요한 경우 새 행이 사이에 추가되면 중복이 발생합니다.
청크에서 콜렉션을 처리하는 더 좋은 방법은 먼저 모든 ID를로드 한 다음이 ID를 실제 페이징 콜렉션의 필터로 사용하는 것입니다.
$ids = Mage::getModel('catalog/product')
->getCollection()
->getAllIds();
$page = 1;
do {
$collection = Mage::getModel('catalog/product')
->getCollection()
->addIdFilter($ids)
->setPageSize(100)
->setCurPage($page);
$results = $collection->load();
// do stuff ......
$page++;
} while ($results->count());