2013-02-11 1 views
0

제품 컬렉션을 사용 하겠지만 id 20 Magento 인 제품을로드 할 때 SQL 쿼리를 반환합니다.Magento가로드 콜렉션에서 쿼리를 반환하는 이유는 무엇입니까?

코드 :

$products = Mage::getModel('catalog/product')->getCollection(); 
$products 
    ->addAttributeToFilter('status',array('eq' => 1)) 
    ->addAttributeToSelect('name') 
    ->addAttributeToSelect('sku') 
    ->addAttributeToSelect('price') 
    ->setPageSize(6); 

echo $products->load(20)->getname(); 

SQL 쿼리 :

SELECT `e`.*, IF(at_status.value_id > 0, at_status.value, at_status_default.value) AS `status` FROM `catalog_product_entity` AS `e` INNER JOIN `catalog_product_entity_int` AS `at_status_default` ON (`at_status_default`.`entity_id` = `e`.`entity_id`) AND (`at_status_default`.`attribute_id` = '96') AND `at_status_default`.`store_id` = 0 LEFT JOIN `catalog_product_entity_int` AS `at_status` ON (`at_status`.`entity_id` = `e`.`entity_id`) AND (`at_status`.`attribute_id` = '96') AND (`at_status`.`store_id` = 1) WHERE (IF(at_status.value_id > 0, at_status.value, at_status_default.value) = 1) LIMIT 6 

답변

0

당신이 매개 변수가 무시됩니다 콜렉션에 부하를 호출하기 때문에. 콜렉션에 대한로드 기능은 아직 실행되지 않은 경우에만 쿼리를 실행합니다.

당신은 할 수 사용 모델 중 하나

foreach($products as $product) { 
    $product->load($product->getId()); // it would be better to add attributes to collection if possible instead of loading the product here 
} 

컬렉션에서 첫 번째 항목을 가져 오기 :

$product = products->getFirstItem(); 
$product->load($product->getId()); 

또는 ID에 의해 컬렉션에서 항목을 얻을 콜렉션

$product = Mage::getModel('catalog/product')->load(20); 

으로 반복 :

$product = $products->getItemById(20); 
$product->load($product->getId()); 

모든 상황에서로드는 제품에서 호출되며 콜렉션에서는 호출되지 않습니다.

가능한 경우 제품에 대한 함수 호출로드를 피하고 (성능에 맞음) addAttributeToSelect을 호출하여 컬렉션에 필수 속성을 추가해야합니다.

관련 문제