我想使用高级表单进行搜索,但使用 mysql OR 语句而不是 AND 语句。
例如,我在产品名称字段中搜索产品“A”,在产品类型字段中搜索“B”。搜索结果必须是 A OR B。
我也改变了条件
系统 > 配置 > 目录 > 目录 > 目录搜索 > 搜索类型
搜索类型 = LIKE
但这不起作用所以有其他方法可以解决这个问题吗?
我想使用高级表单进行搜索,但使用 mysql OR 语句而不是 AND 语句。
例如,我在产品名称字段中搜索产品“A”,在产品类型字段中搜索“B”。搜索结果必须是 A OR B。
我也改变了条件
系统 > 配置 > 目录 > 目录 > 目录搜索 > 搜索类型
搜索类型 = LIKE
但这不起作用所以有其他方法可以解决这个问题吗?
您需要在自定义模块中重写
Mage_CatalogSearch_Model_Resource_Advanced_Collection
(\app\code\core\Mage\CatalogSearch\Model\Resource\Advanced\Collection.php)
并在方法结束时替换addFieldsToFilter
(Magento 1.7.0.2 上的第 132 行)
if (!is_null($previousSelect)) {
$select->where('t1.entity_id IN (?)', new Zend_Db_Expr($previousSelect));
}
经过
if (!is_null($previousSelect)) {
$select->orWhere('t1.entity_id IN (?)', new Zend_Db_Expr($previousSelect));
}
使用orWhere
而不是where
将下一个条件作为 OR 添加到查询中。
我没有对它进行太多测试,所以可能有一些取决于属性类型的技巧,但它似乎对文本属性很有效。
更新您需要扩展(或出于测试目的而修改)Mage_CatalogSearch_Model_Resource_Advanced
和更改addIndexableAttributeModifiedFilter
Magento 1.7.0.2 上第 191 行的方法的下拉属性
$select->where("{$tableAlias}.value IN(?)", $value);
经过
$select->orWhere("{$tableAlias}.value IN(?)", $value);
请注意,这远不是一个完整的解决方案,因为它在混合文本和 dropdonws 时不起作用。实现完整的 OR 应该稍微复杂一些,因为您在添加过滤器时可能必须检查现有条件。
干杯