4

私はすべての有効化された製品と無効化された製品を取得しようとしていますが、このコードを使用しています:

/*$categoryId = 3; // a category id that you can get from admin
    $category = Mage::getModel('catalog/category')->load($categoryId);

    $collection = Mage::getModel('catalog/product')
                    ->getCollection()
                   ->addCategoryFilter($category)
                    ->addAttributeToSelect('*')
                    ->addAttributeToFilter('status', array('gt' => 0))
                    ->load();

$categoryId = 3; // a category id that you can get from admin
    $category = Mage::getModel('catalog/category')->load($categoryId);*/

上記のコードは、有効な製品のみをもたらします。

ステータス フィルターにコメントすることで、有効な製品のみという同じ結果が得られます。

    /*$collection = Mage::getModel('catalog/product')
                    ->getCollection()
                   ->addCategoryFilter($category)
                    ->addAttributeToSelect('*')
                    //->addAttributeToFilter('status', array('gt' => 0))
                    ->load();*/

それはまだ有効な製品のみをもたらします。しかし、カテゴリチェックをコメントすると、すべての製品が表示されます:(誰か助けてくれますか?

ノート:

このクエリについてよくわからない人のために、 Status Enabled = 1Status Disabled = 2をお伝えしましょう。

したがって、ステータスがゼロより大きい場合、有効な製品と無効な製品の両方が表示されるはずですが、そうではありません。それで何か考えはありますか???

私はコードを編集し、

$collection = Mage::getModel('catalog/category')->load(3)
                    ->getProductCollection()
                    ->addAttributeToSelect('*')
                    ->addAttributeToSort('entity_id', 'ASC');

die((string) $collection->getSelect());

そして、これはこのクエリをもたらします:

SELECT `e`.*, `cat_index`.`position` AS `cat_index_position` FROM `catalog_product_entity` AS `e` INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id=1 AND cat_index.category_id='3' ORDER BY `e`.`entity_id` ASC
4

4 に答える 4

8

私はなぜこれが起こっているのかを発見しました。

これは、クエリを使用して$productCollection->addCategoryFilter()、または$category->getProductCollection()クエリを使用してカテゴリから商品を取得する場合、商品からカテゴリへの接続INDEXテーブルを使用するためです。再インデックスを実行すると、その製品カテゴリ接続のINDEXテーブルには有効な製品のみが入力され、その方法で無効な製品を取得することはできません。このバグはMagentoにあるのか、私にはわかりません。RawSQLクエリを使用して、特定のカテゴリから製品を取得できます。

于 2012-10-09T13:41:20.800 に答える
3

有効な製品をフィルタリングするコレクションで使用する->addAttributeToFilter('status', array('gt' => 0))ため、この行を削除してすべての製品を取得できます

于 2012-07-27T07:30:29.303 に答える
3

あなたの例を使用して、私のカテゴリ ID を反映するためにマイナーな変更を加えます。

カテゴリ 233 には 44 個の製品があり、すべて有効になっています。

    $categoryId = 233; // a category id that you can get from admin

$category = Mage::getModel('catalog/category')->load($categoryId);

$collection = Mage::getModel('catalog/product')
    ->getCollection()
    ->addCategoryFilter($category)
    ->addAttributeToSelect('*')
//  ->addAttributeToFilter('status', array('gt' => 0)) //filter commented, show all products
    ->load();

echo $collection->count(); // 44 products


$category = Mage::getModel('catalog/category')->load($categoryId);

$collection = Mage::getModel('catalog/product')
    ->getCollection()
    ->addCategoryFilter($category)
    ->addAttributeToSelect('*')
    ->addAttributeToFilter('status', array('eq' => 1)) //show only enabled
    ->load();

echo $collection->count(); // 44 products

$collection = Mage::getModel('catalog/product')
    ->getCollection()
    ->addCategoryFilter($category)
    ->addAttributeToSelect('*')
    ->addAttributeToFilter('status', array('eq' => 2)) //only disabled 
    ->load();

echo $collection->count(); // 0 products

コメントで言ったように、可能な両方のステータスを取得したいのに、なぜステータスをフィルタリングしたいのかわかりません。

于 2012-07-31T09:11:23.603 に答える
2

Magento の定数 Mage_Catalog_Model_Product_Status::STATUS_DISABLEDを使用すると、カテゴリ内で無効になっている製品のみが返されます

$products = Mage::getModel('catalog/category')->load($category_id)
->getProductCollection()
->addAttributeToSelect('*')
->addAttributeToFilter(
    'status',
    array('eq' => Mage_Catalog_Model_Product_Status::STATUS_DISABLED)
);
于 2013-08-16T21:17:17.463 に答える