不,我不相信你错过了什么。我碰到类似的问题,并且使用getSelect()->where()
来解决它。
与您的查询开始:
SELECT * FROM products WHERE (name like '%blah%' and name like
'%yes%') or (description like '%blah%' and description like '%yes%');
首先,我创建了一个收集和使用的OR
阵列方法来获取查询。
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addFieldToFilter(array(
array('attribute' => 'name', 'like' => '%blah%'),
array('attribute' => 'name', 'like' => '%yes%')
));
$collection->addFieldToFilter(array(
array('attribute' => 'description', 'like' => '%blah%'),
array('attribute' => 'description', 'like' => '%yes%')
));
$collection->load(true); // To dump the sql as text
这导致了以下的输出:
SELECT `e`.*, IF(at_name.value_id > 0, at_name.value, at_name_default.value) AS `name`, IF(at_description.value_id > 0, at_description.value, at_description_default.value) AS `description` FROM `catalog_product_entity` AS `e` INNER JOIN `catalog_product_entity_varchar` AS `at_name_default` ON (`at_name_default`.`entity_id` = `e`.`entity_id`) AND (`at_name_default`.`attribute_id` = '96') AND `at_name_default`.`store_id` = 0 LEFT JOIN `catalog_product_entity_varchar` AS `at_name` ON (`at_name`.`entity_id` = `e`.`entity_id`) AND (`at_name`.`attribute_id` = '96') AND (`at_name`.`store_id` = 1) INNER JOIN `catalog_product_entity_text` AS `at_description_default` ON (`at_description_default`.`entity_id` = `e`.`entity_id`) AND (`at_description_default`.`attribute_id` = '97') AND `at_description_default`.`store_id` = 0 LEFT JOIN `catalog_product_entity_text` AS `at_description` ON (`at_description`.`entity_id` = `e`.`entity_id`) AND (`at_description`.`attribute_id` = '97') AND (`at_description`.`store_id` = 1)
WHERE ((IF(at_name.value_id > 0, at_name.value, at_name_default.value) LIKE '%blah%') OR (IF(at_name.value_id > 0, at_name.value, at_name_default.value) LIKE '%yes%')) AND ((IF(at_description.value_id > 0, at_description.value, at_description_default.value) LIKE '%blah%') OR (IF(at_description.value_id > 0, at_description.value, at_description_default.value) LIKE '%yes%'))
你会发现WHERE
说法几乎是在那里你描述它除了OR
和AND
是相反的。
我复制查询的WHERE
部分和增加了一个额外getSelect()->where()
线到集合是这样的:
$collection = Mage::getModel('catalog/product')->getCollection();
// I added these lines to ensure that the collection would load
// the fields and do the necessary joins to pull the data
$collection->addFieldToFilter('name');
$collection->addFieldToFilter('description');
// I'm using the same WHERE statement but I have set the ANDs and ORs
// to match your requirements
$collection->getSelect()->where(" (IF(at_name.value_id > 0, at_name.value, at_name_default.value) LIKE '%blah%') AND (IF(at_name.value_id > 0, at_name.value, at_name_default.value) LIKE '%yes%')) OR ((IF(at_description.value_id > 0, at_description.value, at_description_default.value) LIKE '%blah%') AND (IF(at_description.value_id > 0, at_description.value, at_description_default.value) LIKE '%yes%')");
$collection->load(true); // To dump the sql as text again
产生的输出是:
SELECT `e`.*, IF(at_name.value_id > 0, at_name.value, at_name_default.value) AS `name`, IF(at_description.value_id > 0, at_description.value, at_description_default.value) AS `description` FROM `catalog_product_entity` AS `e` INNER JOIN `catalog_product_entity_varchar` AS `at_name_default` ON (`at_name_default`.`entity_id` = `e`.`entity_id`) AND (`at_name_default`.`attribute_id` = '96') AND `at_name_default`.`store_id` = 0 LEFT JOIN `catalog_product_entity_varchar` AS `at_name` ON (`at_name`.`entity_id` = `e`.`entity_id`) AND (`at_name`.`attribute_id` = '96') AND (`at_name`.`store_id` = 1) INNER JOIN `catalog_product_entity_text` AS `at_description_default` ON (`at_description_default`.`entity_id` = `e`.`entity_id`) AND (`at_description_default`.`attribute_id` = '97') AND `at_description_default`.`store_id` = 0 LEFT JOIN `catalog_product_entity_text` AS `at_description` ON (`at_description`.`entity_id` = `e`.`entity_id`) AND (`at_description`.`attribute_id` = '97') AND (`at_description`.`store_id` = 1)
WHERE (IF(at_name.value_id > 0, at_name.value, at_name_default.value) = '') AND (IF(at_description.value_id > 0, at_description.value, at_description_default.value) = '') AND ((IF(at_name.value_id > 0, at_name.value, at_name_default.value) LIKE '%blah%') AND (IF(at_name.value_id > 0, at_name.value, at_name_default.value) LIKE '%yes%')) OR ((IF(at_description.value_id > 0, at_description.value, at_description_default.value) LIKE '%blah%') AND (IF(at_description.value_id > 0, at_description.value, at_description_default.value) LIKE '%yes%'))
在getSelect()
的where()
可以是缩写为:
(`name` like '%blah%' and `name` like '%yes%') or (`description` like '%blah%' and `description` like '%yes%');
任何其他Magento人在那里请随时纠正我,如果我太远离这个基地或如果你知道的方式来实现相同的目标,而不使用这种方法。
hth!
感谢您的分享。我希望有一个Magento方法,为了一致起见,我们可以避免编写SQL,但这是一个功能性的解决方案。 – Tyler 2013-03-03 08:18:46