0

製品のコレクションを使用しますが、IDが20の製品をロードすると、MagentoはSQLクエリを返します。

コード:

$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
4

1 に答える 1

0

コレクションでloadを呼び出しているため、パラメーターは無視されます。コレクションのLoad関数は、まだ実行されていない場合にクエリを実行するだけです。

次のいずれかのモデルを使用できます。

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

コレクションを繰り返し処理します。

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 = $products->getItemById( 20 );
$product->load( $product->getId() );

すべての状況で、ロードはコレクションではなく製品で呼び出されることに注意してください。

また、可能であれば製品のロード関数呼び出しを避け(パフォーマンスヒット)、addAttributeToSelect代わりに呼び出しを使用してコレクションに必要な属性を追加する必要があることにも注意してください。

于 2013-02-11T14:11:28.990 に答える