0

我在产品系列中工作,返回产品并尝试订购它们。问题是我的产品属性之一(我在项目的 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');,但这不起作用,只是错误。

非常感谢

更新:

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

$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%')'

4

2 回答 2

1

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

于 2012-09-21T09:31:45.970 回答
0

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

于 2012-09-25T08:10:29.287 回答