过去你一直很有帮助,我一直在寻找帮助和学习。
这次我试图让所有数量大于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表的qty
和is_in_stock
列。您可以按如下方式测试它:
$products->getFirstItem()->getQty();
$products->getFirstItem()->getIsInStock();
当我尝试按qty
和is_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中运行该查询,它也不会过滤。
我做错了什么?有关如何根据连接到表的属性进行过滤的任何想法吗?
再次感谢你,
Margots
答案 0 :(得分:2)
我建议您尝试使用$products->addAttributeToFilter...
而不是$products->addFieldToFilter...
- 只有当字段位于您要查询的主表上时,addField方法才有效(在本例中为catalog_product_entity
) 。由于广告资源字段位于已连接的表格中,因此您需要使用addAttribute
。
希望这有帮助, JD
答案 1 :(得分:0)
经过深入研究后,我了解到_selectAttributes
类中未分配Mage_Eav_Model_Entity_Collection_Abstract
实例字段,这就是获得异常的原因。解决方案通常是Jonathan Day上面建议的 - 然而,添加addAttributeToFilter()
方法。它将返回错误,因为它无法找到目录/产品的此类属性。 (qty
和in_invetory
位于cataloginventory_stock_item
)。我找到了解决问题的两个方法,这两个方法都需要朝不同的方向发展:
其中一个涉及寻找一种方法来查询我为产品集合设置的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'];
}
我没有使用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
并且有库存。