加入后,无法通过属性数量过滤 - 让产品从库存是在股票(After join, cannot fil

2019-09-27 09:02发布

你一直在我继续回来寻求帮助和学习过去那么有用。

这一次,我想获得具有大于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')      
     );

这将返回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该查询,它的工作原理。

艾伦风暴在他的教程中提到,“数据库查询将无法进行,直到你尝试在集合访问项目”。 于是,我让$产品 - > getFirstItem()调用,但它仍然不执行换句话说查询或过滤。

我究竟做错了什么? 任何想法如何由被连接表中的属性过滤器?

再次感谢你,

玛戈

Answer 1:

我建议您尝试使用$products->addAttributeToFilter...而不是$products->addFieldToFilter... -激活addField方法只有当字段是您所查询(在这种情况下,主表的工作原理catalog_product_entity )。 由于库存字段是一个连接表,你需要使用addAttribute

希望这有助于,JD



Answer 2:

引擎盖下看后我才知道, _selectAttributes实例字段中未分配Mage_Eav_Model_Entity_Collection_Abstract类,这就是为什么得到例外。 一个解决方案通常会是什么乔纳森·天以上建议-增加addAttributeToFilter()方法,但是。 它会返回错误,因为它找不到目录/产品这样的属性。 ( qtyin_invetorycataloginventory_stock_item )。 我发现了两个解决方案,我的问题都需要去不同的方向:

  1. 一位参与寻求一种方法来查询Select语句,我已经为产品收集组(见上文),但不知何故,没有重置与新产品的收集。 WhenI复制的在phpMyAdmin的Sql statment,它的工作,所以如何查询从产品集合声明:

      $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')); 

现在有与所有产品的集合qty > 0 ,且并非股票。



文章来源: After join, cannot filter by attribute qty - getting products from inventory that are in stock