在讲magento筛选过滤器之前,先说一下调试SQL查询:
有两种方法调试加载在Magento集合时正在执行的查询。
// Method 1
Mage::getModel('catalog/product')->getCollection()->load(true);
// Method 2 (Quicker, Recommended)
$collection = Mage::getModel('catalog/product')->getCollection();
echo $collection->getSelect();
方法1和方法2都是打印查询的,但各自有略微不同的方式。方法1,打印查询以及装载产品,而方法2将只查询对象转换为一个字符串(即会打印出的SQL语句)。第二种方法是肯定更好。!
Magento的集合实际上就是一个包含其它模型的模型,所以我们可以用Product集合来取代数组存放一组产品。集合除了可以提供一个更为便捷的模型分组数据结构,还提示一些可用于操作实体集合的一些特定方法,下面我就介绍一下他们:
1、addFieldToFilter():
用于为集合添加一个属性滤镜,该函数用于普通的非EAV模型,如下:
$product_review = Mage::getModel('review/review_summary')->getCollection()
->addFieldToFilter('entity_pk_value', array('eq' => $product_id))
->getData();
2、addAttributeFilter()
使用addAttributeFilter()作为过滤器是直接对属性进行过滤筛选,如下:
$review_collection = Mage::getModel('review/review')->getCollection() ->addStoreFilter(Mage::app()->getStore()->getId())
->addStatusFilter(Mage_Review_Model_Review::STATUS_APPROVED)
->addFieldToFilter('entity_pk_value', array('in' => $childProductIds))
->setDateOrder()
->setPageSize(self::REVIEW_COUNT)
->addRateVotes();
3、addAttributeToFilter()
方法用于过滤EAV实体中的集合,如下:
$products = Mage::getModel('catalog/product')->getCollection()
->addAttributeToFilter('entity_id', array('in' => $ids));
4、addAttributeToSelect()
用于为集合中实体添加属性,可使用星号“ * ”来作为通配符来添加所有属性,但是这里要说明一下这个“ * ”不要轻易使用,它很消耗性能的,最好是添加指定的属性,如下:
$collection = Mage::getModel('catalog/product')->getCollection()
->setStore($this->_getStore())
->addAttributeToSelect('name')
->addAttributeToSelect('sku')
->addAttributeToSelect('price')
->addAttributeToSelect('attribute_set_id');
5、addAttributeToSort()
该方法用于添加属性来进行排序,如下:
$collection = $order->getCollection()
->addAttributeToFilter('created_at', array('date'=>true, 'from'=> $passDate))
->addAttributeToSort('created_at','desc');
Magento的addFieldToFilter方法支持如下条件表达式:
Attribute code SQL condition
condition | symbol |
---|---|
eq | = |
neq | != |
like | LIKE |
nlike | NOT LIKE |
in | IN () |
nin | NOT IN () |
is | IS |
notnull | NOT NULL |
null | NULL |
moreq | >= |
gt | > |
lt | < |
gteq | >= |
lteq | <= |
finset | FIND_IN_SET() |
from | >= |
to | <= |