我有一个带自定义表的自定义模块,现在,我正在尝试为该表制作类似过滤器的内容,
Mage::getModel('comunity/news')->getCollection()
->addFieldToFilter('title', array('like'=>'%'.$this->getRequest()->getParam('q').'%'));
用这个就足够了,而且效果很好,但我需要添加另一个字段,如果你喜欢这个就很简单
Mage::getModel('comunity/news')->getCollection()
->addFieldToFilter('title', array('like'=>'%'.$this->getRequest()->getParam('q').'%'))
->addFieldToFilter('shortdesc', array('like'=>'%'.$this->getRequest()->getParam('q').'%'));
它可以工作,但它创建一个(AND),我想要一个(OR),我看着Varien_Data_Collection_Db类,函数addFieldToFilter调用_getConditionSql,你可以看到这样的东西
if (is_array($fieldName)) {
foreach ($fieldName as $f) {
$orSql = array();
foreach ($condition as $orCondition) {
$orSql[] = '('.$this->_getConditionSql($f[0], $f[1]).')';
}
$sql = '('. join(' or ', $orSql) .')';
}
return $sql;
}
这里可以做(OR),我已经尝试了
->addFieldToFilter(array (
array('field'=>'title', 'like'=>'%'.$this->getRequest()->getParam('q').'%'),
array('field'=>'shortdesc', 'like'=>'%'.$this->getRequest()->getParam('q').'%'),
))
但它所做的查询是
SELECT `main_table`.* FROM `uhma_comunidad_articulos` AS `main_table` WHERE (())
我需要一些帮助 感谢
答案 0 :(得分:1)
我认为问题在于您需要使用addAttributeToFilter
而不是addFieldToFilter
。查看Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection
,您会看到addAttributeToFilter
方法正在测试数组,然后添加为OR
:
if (is_array($attribute)) {
$sqlArr = array();
foreach ($attribute as $condition) {
$sqlArr[] = $this->_getAttributeConditionSql($condition['attribute'], $condition, $joinType);
}
$conditionSql = '('.join(') OR (', $sqlArr).')';
$this->getSelect()->where($conditionSql);
return $this;
}
addFieldToFilter
中的 Varien_Data_Collection_Db
只是将字段添加到where
而不测试数组。
修改强>
刚刚注意到您在自己的自定义模块的集合中使用它,而不是Mage产品集合。这意味着您需要在addAttributeToFilter
Collection.php
下自己实施Model\mysql4\News\
方法。或者,代替Varien_Data_Collection_Db
,使您的集合扩展Mage_Eav_Model_Entity_Collection_Abstract
,其中包括已实现的实现。
HTH, JD
答案 1 :(得分:1)
也许这篇文章可以提供帮助: Match as OR
答案 2 :(得分:0)
我已经成功使用addFieldToFilter这样的默认功能:
$collection->addFieldToFilter(
array('first_name','last_name'),
array($post['firstName'],$post['lastName'])
);
当我打印sql时这是有效的(这只是打印整个语句的一部分):
((first_name = 'r') OR (last_name = 't'))
现在我想了解如何使用'like'
代替=
。