2013-11-03 5 views
1

내가 그 권리를 묻는 지 모르겠다. 제품을로드하고 값을 변경하고 저장해야한다.마젠타에서 모델을로드하는 것이 더 좋은 방법은 무엇입니까?

$id = Mage::getModel('catalog/product')->getIdBySku($sku); 
$product = Mage::getModel('catalog/product')->load($id); 

1) 내가이 방법은 메모리 누수로 이어지는 것을 읽을 40K products.But 미세에도 작동 일반적으로 : 내 질문 it.Currently 내가 그 방법을 사용하고 할 수있는 적절한 어떤 방법입니까? 또한 해당 솔루션에 대한 내가 reindex 기능을 해제하면 프로세스 시간을 향상시킬 수있는 읽었습니다.

2) 다른 방법을 사용하여 컬렉션으로로드 한 다음 일부 필터를 적용하면 ex addFieldToFilter('sku',$the_product_i_want) 이 더 좋을까요?

내가 더 잘 말할 때 : 1) 마젠타 방법, 2) 시간 효율적 3) 내가 할 필요가없는 일을하지 말라.

+0

나는 당신이 개념을 혼합하고있는 것처럼 보일 것입니다. addFieldToFilter - 컬렉션에 관한 것입니다. Mage :: getModel ('catalog/product') -> load() - 모델에 관한 것입니다. 난 당신의 질문의 "올바른"형태가 될 것이라고 가정합니다 - 뭐죠 최선 : 1) 먼저 db에서 모든 제품을로드하고 다음 필터는 PHP의 수단으로 처리 할 필요가 필터 2) MySQL의 수단으로 필요한 제품을 필터링 (addFieldToFilter가하는 것입니다),로드 된 모든 제품을 업데이트하면 대답은 두 번째 옵션이됩니다. –

+0

만약 내가 그렇게한다면 : Mage :: getModel ('catalog/product') -> load() 나는 모든 제품을로드합니까? 모델 제품을 호출하기 때문에 하나의 제품을로드하기 위해 id를 사용하더라도? 하지만 Magento를 더 잘 이해하려고 노력하고 있습니다. @ Rob – vbak

+1

아, 알겠습니다. 음, model-> load()는 모델을로드하는 메소드입니다. "모델"개념은 대략적으로 데이터 구조의 단일 인스턴스처럼 말합니다. 나는. product는 데이터 구조이며, -> load ($ id)를 호출하면 주어진 $ id에 의해 db로부터 데이터를 가져 와서 구조체를 채 웁니다. addFieldToFilter는 모델이 아닌 콜렉션에 적용되는 항목입니다. 컬렉션 개념 - 단일 요청으로 DB에서 가져온 일련의 제품입니다 (대부분의 경우 일반 컬렉션은 단일 인스턴스 집합을 추상화 함). 그래서 당신이 할 때 -> addFieldToFilter, 당신은 귀하의 컬렉션 요청에 조건을 추가 –

답변

4

다음 코드 스 니펫을 호출 할 때마다 Magento는 메모리에 새 모델 개체를 만듭니다. 그리고 그것은 메모리 누출로 이어질 것입니다. 다음과 같이 할 수 있습니다.

$model = Mage::getModel('catalog/product'); 
$id = $model->getIdBySku($sku); 
$product = $model->load($id); 

동시에 if you have the product object에서 다음 코드를 사용할 수 있습니다.

$collection = Mage::getModel('catalog/product')->getCollection(); 
$product = $collection->addFieldToFilter('sku',$the_product_i_want); 
+5

정확하게 말하자면, C에서 찾을 수있는 것처럼 고전적인 메모리 누수가 발생하지는 않지만 높은 메모리 사용량을 초래할 수 있습니다. – siliconrockstar

+1

하지만 성능에 영향을줍니다. – Sukeshini

관련 문제