加入后,无法按属性数量进行过滤 - 从库存中获取库存产品

时间:2010-08-08 15:59:05

标签: collections magento

过去你一直很有帮助,我一直在寻找帮助和学习。

这次我试图让所有数量大于1并且有库存的产品(is_in_stock = 1)

    $products = Mage::getModel('catalog/product')->getCollection();    
    //$products->addAttributeToSelect('*');        

    //SELECT `e`.*, `stock`.`qty` FROM `catalog_product_entity` AS `e` LEFT JOIN `cataloginventory_stock_item` AS `stock` ON stock.product_id = e.entity_id       
    $products->getSelect()->joinLeft(      
       array('stock'=>'cataloginventory_stock_item'),     
       'stock.product_id = e.entity_id',      
       array('stock.qty', 'stock.is_in_stock')      
     );

这将返回附加到products表的qtyis_in_stock列。您可以按如下方式测试它:

$products->getFirstItem()->getQty();        
$products->getFirstItem()->getIsInStock();        

当我尝试按qtyis_in_stock进行过滤时,问题就开始了。

    $products->addFieldToFilter(array(       
       array('Qty','gt'=>'0'),      
       array('Is_in_stock','eq'=>'1'),        
    ));       

返回 - Invalid attribute name从不执行过滤。我猜它正在尝试搜索e.qty但找不到它。

所以,我尝试过滤不同的方式:

$products->getSelect()->where("`qty` > 0");        
$products->getSelect()->where("`is_in_stock` = 1");          

即使你查看它的sql查询(var_dump((string) $products->getSelect()))并在phpMyAdmin中运行该查询,它也不会过滤。

<{3}}中的Alan Storm提到“在您尝试访问集合中的项目之前,不会进行数据库查询”。所以,我进行了$ products-&gt; getFirstItem()调用,但它仍然没有执行查询或过滤用另一个词。

我做错了什么?有关如何根据连接到表的属性进行过滤的任何想法吗?

再次感谢你,

Margots

2 个答案:

答案 0 :(得分:2)

我建议您尝试使用$products->addAttributeToFilter...而不是$products->addFieldToFilter... - 只有当字段位于您要查询的主表上时,addField方法才有效(在本例中为catalog_product_entity) 。由于广告资源字段位于已连接的表格中,因此您需要使用addAttribute

希望这有帮助, JD

答案 1 :(得分:0)

经过深入研究后,我了解到_selectAttributes类中未分配Mage_Eav_Model_Entity_Collection_Abstract实例字段,这就是获得异常的原因。解决方案通常是Jonathan Day上面建议的 - 然而,添加addAttributeToFilter()方法。它将返回错误,因为它无法找到目录/产品的此类属性。 (qtyin_invetory位于cataloginventory_stock_item)。我找到了解决问题的两个方法,这两个方法都需要朝不同的方向发展:

  1. 其中一个涉及寻找一种方法来查询我为产品集合设置的Select语句(见上文),但不知何故它没有用新产品重置集合。当我在phpMyAdmin中复制了那个Sql语句时,它有效,所以如何从产品集合中查询该语句:

     $stmt = $products->getConnection('core_write')->query($products->getSelect()->__toString());      
    
    while($rows = $stmt->fetch(PDO::FETCH_ASSOC)){    
      echo "<br>Product Id ".$rows['entity_id'];    
    }    
    
  2. 我没有使用catalog/product实体表,而是使用平面表 - cataloginventory_stock_item来完成同样的事情

    $stockItem = new Mage_CatalogInventory_Model_Stock_Item();    
    $stockItems->addQtyFilter('>',0);    
    $stockItems->addFieldToFilter('is_in_stock',array('eq'=>'1'));     
    
  3. 现在有一个所有产品的集合qty > 0并且有库存。