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 中是否存在此错误我不知道,您可以使用 Raw SQL 查询从特定类别中获取您的产品。

于 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 回答