Php Magento使用集合创建一个(或)

Php Magento使用集合创建一个(或),php,magento,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').'%'));
有了这个就足够了,而且效果很好,但是我需要添加另一个字段,如果您喜欢这个,这个字段很简单

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;
    }
这里有一个(或)可以做,我已经试过了

->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 (())
我需要一些帮助
谢谢

我认为问题在于您需要使用
addAttributeToFilter
而不是
addFieldToFilter
。查看
Mage\u Catalog\u Model\u Resource\u Eav\u Mysql4\u Product\u Collection
,您将看到
addAttributeToFilter
方法正在测试数组,然后作为
添加:

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;
    }
Varien_Data_Collection_Db
中的
addFieldToFilter
只是将字段添加到
中,其中
没有测试数组


编辑

刚刚注意到,您正在使用来自您自己的自定义模块的集合,而不是Mage产品集合。这意味着您需要在
Model\mysql4\News\
下的
Collection.php
中自己实现
addAttributeToFilter
方法。或者,代替
Varien\u Data\u Collection\u Db
,让您的集合扩展
Mage\u Eav\u Model\u Entity\u Collection\u Abstract
,其中已经包含了实现

嗯,, JD

也许这篇文章可以帮助:
.

我已经通过addFieldToFilter默认功能做到了这一点,如下所示:

$collection->addFieldToFilter(
    array('first_name','last_name'),
    array($post['firstName'],$post['lastName'])             
);
这在我打印sql时起作用(这只是打印的整个语句的一部分):

现在我正在尝试理解如何使用
'like'
而不是
=


希望能有所帮助。

实际上addFieldToFilter确实测试数组,请再次阅读我的帖子。因此,我不能使用addAttributeToFilter,因为我没有使用EAV,我只是使用一个简单的表,如果我尝试使用addAttributeToFilter,我将调用undefined方法,但如果我从Mage_EAV_Model_Entity_collection_Abstract扩展我的集合,是否适用于单个表??我的建议是,在名称空间\module\Model\mysql4\News\下编辑Collection.php,以使用addAttributeToFilter()方法。您可以使用Mage_Eav_Model_Entity_Collection_Abstract::addAttributeToFilter()作为示例。这样,您不必更改继承,但您可以从OR中获益。
((first_name = 'r') OR (last_name = 't'))