【问题标题】:filtering product collection on "is_salable"在“is_salable”上过滤产品集合
【发布时间】:2011-07-15 04:23:17
【问题描述】:

我想过滤产品集合以仅显示有货的商品。我认为这很容易,因为有一个名为“is_salable”的属性,如果有库存,则为 1(真),如果没有,则为 0(假)。但无论我做什么,它都不起作用。此外,它似乎会在查询完成之前停止执行。

这里有一些示例代码:

$this->_productCollection = Mage::getModel('catalog/product')->getCollection();
$this->_productCollection->addAttributeToSelect('*');
$this->_productCollection->addAttributeToFilter('my_attribute', true);
//So far, so good...filtering on 'my_attribute' works!
Mage::Log("select: " . $this->_productCollection->getSelect());
//Successfully outputs the SQL query
$this->_productCollection->addFieldToFilter('is_salable', '1');
Mage::Log("select: " . $this->_productCollection->getSelect());
//does NOT output any query...it's like it died trying

那么我做错了什么?我尝试了“addFieldToFilter”、“addAttributeToFilter”和其他其他查询,例如:addFieldToFilter('is_salable', array('eq' => true)) 等...

有人知道怎么做吗?如果“is_salable”不是答案,我需要做的就是过滤掉没有库存的产品......所以无论做什么都可以:)

谢谢!

【问题讨论】:

  • 快速提示:有时无法正确转储选择对象,至少在内存不足的情况下无法正确转储。将其转换为字符串更可靠...(string)$this->getProductCollection()->getSelect()
  • __toString() 方法在与字符串连接时会自动被调用(自 PHP 5.2 起,请参阅 the docs
  • @jongosi 实际上函数名称是isSalable,如 Mage_Catalog_Model_Product 中所定义,因此您的评论不正确。

标签: magento magento-1.4


【解决方案1】:

产品中没有is_salable属性,所以会引发异常。如果您只想显示有货的产品,请使用此库存模型addInStockFilterToCollection 方法:

Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($this->_productCollection);

【讨论】:

  • 谢谢,@ivan-chepurnyi!效果很好!但是,我仍然有点困惑。如果我遍历集合中的产品并打印出每个产品,则该产品包含一个名为“is_salable”的“属性”。那是无法过滤的生成元素吗?这就是它与其他可过滤属性不同的原因吗?
  • 在 Mage_Catalog_Model_Product 上的 isSalable() 函数中结帐。很多时候,常规的 ol' 属性没有特定的方法。在这种情况下,它看起来像是在另一个类 Mage_Catalog_Model_Product_Type_Simple(或 Mage_Catalog_Model_Product_Type_Grouped 或 Mage_Catalog_Model_Product_Type_Configurable 取决于产品类型)上调用 isSalable() 函数
  • @BrianVPS is_salable 产品列表中的属性是可能的 isSalable 方法调用的索引值。 isSalable 方法调用的结果可能会有所不同,具体取决于 Mage_CatalogInventory 模块观察者中定义的产品类型和逻辑。也可能与实际的方法调用不同,如果在自定义模块开发过程中,也没有自定义相应的索引。
  • 谢谢 Ivan,我是 SO 新手,所以不知道协议 :) 感谢您的帮助!
【解决方案2】:

也试试这个...

$stockCollection = Mage::getModel('cataloginventory/stock_item')->getCollection()->addFieldToFilter('qty', array('gteq' => 1))->addFieldToFilter('type_id', 'simple');

addFieldFilter('qty',array('gteq' =>1))

获取所有库存为 1 或更多的产品集合,您可以根据需要在此处输入任意数量

addFieldToFilter('type_id', 'simple')

按简单产品过滤

【讨论】:

  • 如果您没有在 Magento 中管理您的库存水平并且只使用进/出库存标志,则此解决方案将不起作用,因为您不需要指定数量以使产品在前端可见.
【解决方案3】:

我偶然发现了 isSaleable() 总是在我的产品上返回 false 的问题,问题是我正在获取集合但没有将属性价格添加到集合中。 在 isSaleable() 函数中有一个检查来确保价格不为 0,它需要 price 属性来检查:

变化:

$collection = Mage::getModel('catalog/product')->getCollection();
        $collection->addAttributeToSelect('name')
                ->addAttributeToSelect('image')
                ->addAttributeToSelect('url_path')
                ->addAttributeToSelect('status')
                ->addUrlRewrite();

收件人:

$collection = Mage::getModel('catalog/product')->getCollection();
        $collection->addAttributeToSelect('name')
                ->addAttributeToSelect('image')
                ->addAttributeToSelect('price')
                ->addAttributeToSelect('url_path')
                ->addAttributeToSelect('status')
                ->addUrlRewrite();

成功了:)

【讨论】:

  • 产品缺货怎么办?它们的价格不是零,但它们不能出售。
猜你喜欢
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多