我有一个自定义产品属性,实际上有三个可能的值 “Frühjahr/ Sommer”,“Herbst / Winter”,“”(空)。
我想按预定义的顺序按此值对产品集合进行排序 例如“Frühjahr/ Sommer”,“Herbst / Winter”,“”或 “Herbst / Winter”,“Frühjahr/ Sommer”,“”
这是交替的。 空值应该在最后,但也许还有更多值,所以它必须是固定的预定义顺序。
我需要执行以下MySQL 按字段排序(saison,“Frühjahr/ Sommer”,“Herbst / Winter”,“”)
问题是我不知道如何在Magento中执行此命令。 我知道“ - > setOrder”-Method但我需要提交一个固定的订单而不是使用DESC或ASC。
我在stackoverflow和google上搜索了很多但到目前为止没有答案。
我希望你能帮助我
由于
[编辑回应magalter的答案]
不幸的是,我以前尝试过它不起作用:
$this->_collection->getSelect()->order(new Zend_Db_Expr("FIELD(season, 'Frühjahr/Sommer','Herbst/Winter','')"));
结果是“处理您的请求时出错。
$this->_collection->getSelect();
返回:
SELECT `e`.*, `cat_index`.`position` AS `cat_index_position`, `price_index`.`price`, `price_index`.`tax_class_id`, `price_index`.`final_price`, IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price) AS `minimal_price`, `price_index`.`min_price`, `price_index`.`max_price`, `price_index`.`tier_price` FROM `catalog_product_entity` AS `e` INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id=1 AND cat_index.visibility IN(2, 4) AND cat_index.category_id='124' INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND price_index.website_id = '1' AND price_index.customer_group_id = 0 ORDER BY FIELD(season, 'Frühjahr/Sommer','Herbst/Winter','')
我在phpMyAdmin中执行了这个sql语句,并在'order clause'中收到以下错误消息“未知列'季'”
如果我按“季节”DESC订购
$this->_collection->setOrder('season', 'DESC');
它有效......并生成以下sql语句
SELECT `e`.*, `cat_index`.`position` AS `cat_index_position`, `price_index`.`price`, `price_index`.`tax_class_id`, `price_index`.`final_price`, IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price) AS `minimal_price`, `price_index`.`min_price`, `price_index`.`max_price`, `price_index`.`tier_price`, IF(season_option_value_t2.value_id IS NULL, season_option_value_t1.value, season_option_value_t2.value) AS `season` FROM `catalog_product_entity` AS `e` INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id=1 AND cat_index.visibility IN(2, 4) AND cat_index.category_id='124' INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND price_index.website_id = '1' AND price_index.customer_group_id = 0 LEFT JOIN `catalog_product_entity_int` AS `season_t1` ON e.entity_id=season_t1.entity_id AND season_t1.attribute_id='180' AND season_t1.store_id=0 LEFT JOIN `catalog_product_entity_int` AS `season_t2` ON e.entity_id=season_t2.entity_id AND season_t2.attribute_id='180' AND season_t2.store_id='1' LEFT JOIN `eav_attribute_option_value` AS `season_option_value_t1` ON season_option_value_t1.option_id=IF(season_t2.value_id > 0, season_t2.value, season_t1.value) AND season_option_value_t1.store_id=0 LEFT JOIN `eav_attribute_option_value` AS `season_option_value_t2` ON season_option_value_t2.option_id=IF(season_t2.value_id > 0, season_t2.value, season_t1.value) AND season_option_value_t2.store_id=1 ORDER BY `season` DESC
但这是DESC的命令,而不是像我想要的预定义顺序,所以我不能使用它。
我需要的是上面带有
的SQL语句ORDER BY FIELD(season, 'Frühjahr/Sommer','Herbst/Winter','')
代替
ORDER BY `season` DESC
另一个想法???
答案 0 :(得分:5)
尝试使用Zend_DB_Select顺序而不是Magento setOrder方法
$colection->getSelect()->order(..)
示例:
->order(array('line_items_per_product DESC',
'product_id'));
请参阅 http://framework.zend.com/manual/1.12/ru/zend.db.select.html#zend.db.select.building.order 更多例子
答案 1 :(得分:3)
最终我找到了解决方案。 也许其他用户需要它,所以这里是:
(可能不是最佳解决方案,但它有效)
我创建了一个新模块并扩展了Mage_Catalog_Block_Product_List_Toolbar。 然后我重写“setCollection”-Method就像这样
public function setCollection($collection)
{
$this->_collection = $collection;
$this->_collection->setCurPage($this->getCurrentPage());
// we need to set pagination only if passed value integer and more that 0
$limit = (int)$this->getLimit();
if ($limit) {
$this->_collection->setPageSize($limit);
}
if ($this->getCurrentOrder()) {
$mySource = $this->_collection->getEntity()->getAttribute('season');
$mySource = $this->_collection->getEntity()->getAttribute('season')->getSource(); //Mage_Eav_Model_Entity_Attribute_Source_Table
$collection = $this->_collection;
$valueTable1 = 'season_t1';
$valueTable2 = 'season_t2';
$collection->getSelect()
->joinLeft(
array($valueTable1 => $mySource->getAttribute()->getBackend()->getTable()),
"e.entity_id={$valueTable1}.entity_id"
. " AND {$valueTable1}.attribute_id='{$mySource->getAttribute()->getId()}'"
. " AND {$valueTable1}.store_id=0",
array()
)
->joinLeft(
array($valueTable2 => $mySource->getAttribute()->getBackend()->getTable()),
"e.entity_id={$valueTable2}.entity_id"
. " AND {$valueTable2}.attribute_id='{$mySource->getAttribute()->getId()}'"
. " AND {$valueTable2}.store_id='{$collection->getStoreId()}'",
array()
);
$valueExpr = $collection->getSelect()->getAdapter()
->getCheckSql("{$valueTable2}.value_id > 0", "{$valueTable2}.value", "{$valueTable1}.value");
Mage::getResourceModel('eav/entity_attribute_option')
->addOptionValueToCollection($collection, $mySource->getAttribute(), $valueExpr);
$sortBySeason = "FIELD(IF(season_option_value_t2.value_id IS NULL, season_option_value_t1.value, season_option_value_t2.value), ";
$getSelectedSeason = Mage::getStoreConfig('sortproductsbyseason_options/general/current_season');
if($getSelectedSeason == "herbst_winter"){
$sortBySeason .= "'Frühjahr/Sommer', 'Herbst/Winter' ,''";
}else{
$sortBySeason .= "'Herbst/Winter', 'Frühjahr/Sommer' ,''";
}
$sortBySeason .= ") DESC";
$this->_collection->getSelect()->order(new Zend_Db_Expr($sortBySeason));
$this->_collection->setOrder($this->getCurrentOrder(), $this->getCurrentDirection());
}
return $this;
}
答案 2 :(得分:0)
这个怎么样?
$collection = Mage::getModel('catalog/category')->load($categoryId)
->getProductCollection()
->addAttributeToSort('name', 'ASC');
答案 3 :(得分:0)
$products->addAttributeToSelect('*')->setOrder('cat_index_position','ASC');;
$products->getSelect()->order(new \Zend_Db_Expr("CASE WHEN `cat_index_position` = '0' THEN 9999 ELSE `cat_index_position` END"));
对我来说,这个答案很有效, https://magento.stackexchange.com/a/121234/71417