기본적으로 페이지 매김을 사용하여 Magento 컬렉션을 반복 할 수 있습니까?


21

내가 의미하는 바는-할 수있는 방법이 있습니까?

$collection = $model->getCollection();
foreach ($collection as $item) { 
    $item->doStuff();
}

이렇게하면 컬렉션에 100k 개의 행이 있더라도 MySQL에서 한 번에 한 행의 페이지 만로드하고 뒤에서 마술처럼 페이지를 매기 게됩니다.

Varien_Data_Collection_Db::load()그것을 보는 것이 가능해 보이지는 않지만 확인하고 싶었습니다. 이것은 일반적으로 필요한 것 같습니다.

답변:


18

당신은 정말로 사용해야합니다

Mage::getSingleton('core/resource_iterator')

언급 한 성능상의 이유로 순수하게 존재하기 때문에이 목적을 위해.

그렇지 않으면, 당신은 함께 루프를 사용하여 약간 덜 우아한 솔루션을 사용할 수있는 setPageSize좋은 예제가 여기있다, - /programming/3786826/how-to-loop-a-magento-collection


1
선생님, 신사이자 학자입니다.
kalenjordan

setPageSize시맨틱 하기 때문에 +1입니다 .
philwinkle

내가 깨달은 또 다른 core/resource_iterator사실은 솔루션이 실제로 mysql 쿼리를 페이지 매김하지 않는다는 것입니다. 전체 결과 세트를 한 번에로드하지만 PHP 코드에서 처리 할 수있는 행을 한 번에 제공합니다. 따라서 PHP 내에서 메모리 결함을 피할 수 있지만 결과 집합이 매우 큰 경우 mysql 최대 패킷 크기를 트리거합니다. 내가 사용하여 멋진 추상 청크 된 resource_iterator를 만들려고 생각합니다setPageSize()
kalenjordan

그래, 나는 mwoar 포인트 를 추구하는 것을 생략했습니다 ! 실제로 단일 제품 로딩 대 페이지 매김 컬렉션을 목표로합니다. 그러나 그것은 기반이되어야합니다.
Ben Lessani-Sonassi

쿼리를 MySQL로 일괄 처리하고 개별 컬렉션 항목 콜백을 제공하는 일반 일괄 처리 반복자를 구현했습니다. 궁금한 점 : gist.github.com/kalenjordan/5483065
kalenjordan

5

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