Magento使用集合制作(OR)

时间:2010-09-13 16:28:28

标签: php magento

我有一个带自定义表的自定义模块,现在,我正在尝试为该表制作类似过滤器的内容,

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 (())

我需要一些帮助 感谢

3 个答案:

答案 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'代替=

希望它有所帮助。