添加* 1以使addAttributeToSort无效

时间:2012-09-21 09:28:45

标签: mysql magento sql-order-by

我正在一个产品系列中工作,返回产品并尝试订购它们。问题是我的产品属性之一(我在项目的90%处发现这个)是一个数量,即250,5000等。但是,我刚刚发现尽管有这些数字,Magento将它们视为字符串,因此集合在此示例中返回以下数量:

50,100,250,500,1000,2000,5000

但是,addAttributeToSort('quantity','ASC');执行此操作:

100,1000,2000,250,50,500,5000

我在集合上做了var_dump()并确定这些值被视为字符串,因此可能会发生这种情况。不幸的是,根据这个属性,我有超过6000种产品有很多自定义实现和可配置产品,所以我不愿意改变它。在这里搜索我发现添加ORDER BY 'quantity' *1实际上确实正确地执行了排序,但我似乎无法在标准addAttributeToSort函数中实现此子句。

如果有人可以帮我实现这一点,我已尝试addAttributeToSort('quantity','*1');但这不起作用,只是错误。

非常感谢

UPDATE:

以下是从以下代码生成的查询语法:

$collection = $this->getUsedProductCollection($product)
                   ->addAttributeToSelect('*')
                   ->addFieldToFilter('name', array( 'like' => '%' . $stock . '%' ));
$collection->getSelect()->order(new Zend_Db_Expr('quantity' *1)); 
count($collection);
  

'SELECT 'e'.*, 'link_table'.'parent_id', IF(at_name.value_id > 0, at_name.value, at_name_default.value) AS 'name', '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_product_super_link' AS 'link_table' ON link_table.product_id = e.entity_id INNER JOIN 'catalog_product_website' AS 'product_website' ON product_website.product_id = e.entity_id AND product_website.website_id = '1' 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' = '65') 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' = '65') AND ('at_name'.'store_id' = 1) 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 WHERE (link_table.parent_id = 3781) AND (IF(at_name.value_id > 0, at_name.value, at_name_default.value) LIKE '%PCL Labels%')'

2 个答案:

答案 0 :(得分:1)

$collection->getSelect()->order(new Zend_Db_Expr('quantity' *1));

答案 1 :(得分:0)

最后,我通过ksort()在PHP中实现了这一点。实现任何Zend函数时的数据库模型在某处被覆盖,我没有时间去理清楚。