Magento-无法设置收集顺序


11

这似乎订购不正确,我做错了什么?有什么建议吗?

$componentQuantityCollection = Mage::getModel('catalog/product')->getCollection();
$componentQuantityCollection->joinField('qty',
    'cataloginventory/stock_item',
    'qty',
    'product_id=entity_id',
    '{{table}}.stock_id=1',
    'left');
$componentQuantityCollection->addAttributeToFilter('sku', array('in' => $componentSkus))->setOrder('sku','ASC');

似乎没有排序的另一个集合与第一个集合不同:

$kitCollection = Mage::getModel('kitinventory/kitinventory')->getCollection()->addFieldToFilter('kit_sku', $sku)->setOrder('related_sku', 'DESC');

Answers:


42

EAV集合使用属性,此处的排序方法也有所不同

$componentQuantityCollection->addAttributeToSort('sku', 'ASC');

对于非EAV集合,请使用以下方法之一

$kitCollection->getSelect()->order('related_sku DESC');
$kitCollection->setOrder('related_sku', 'DESC');

那第二个收藏呢?
easymoden00b 2015年

那是一个平面类型集合,因此没有EAV和属性。看一下这个答案的排序方式:stackoverflow.com/a/11354060
Sander Mangel

我尝试了setOrder('related_sku','DESC'); 但未排序。
easymoden00b 2015年

我已经编辑了答案
桑德·曼格

2
@ easymoden00b使用$kitCollection->getSelect()->order('related_sku DESC');
Priyank


3

要在此处扩展其他答案,$kitCollection->getSelect()->order('column DESC')效果很好,但您不能添加多个列。例如,$kitCollection->getSelect()->order('column DESC, column2 ASC')将出错。这是因为Magento所做的工作是转义列名。为了解决这个问题,您可以使用Zend_Db_Exprlike这样:

$kitCollection->getSelect()->order(new Zend_Db_Expr('related_sku DESC, column2 ASC'));

1

easymoden00b,setOrder()由于产品上有Eav结构,因此无法正常工作addAttributeToSort()

  • Magento is join multiple tables for product collection.

  • Attribute alias name at collection

  • setOrder() function工作时,order expression 字段名,SortOrder的correct

您可以看到,magento如何创建字段别名,并且如何在类Mage_Eav_Model_Entity_Collection_Abstract中关联eav表属性

public function addAttributeToSort($attribute, $dir = self::SORT_ORDER_ASC)
{
    if (isset($this->_joinFields[$attribute])) {
        $this->getSelect()->order($this->_getAttributeFieldName($attribute).' '.$dir);
        return $this;
    }
    if (isset($this->_staticFields[$attribute])) {
        $this->getSelect()->order("e.{$attribute} {$dir}");
        return $this;
    }
    if (isset($this->_joinAttributes[$attribute])) {
        $attrInstance = $this->_joinAttributes[$attribute]['attribute'];
        $entityField = $this->_getAttributeTableAlias($attribute) . '.' . $attrInstance->getAttributeCode();
    } else {
        $attrInstance = $this->getEntity()->getAttribute($attribute);
        $entityField = 'e.' . $attribute;
    }

    if ($attrInstance) {
        if ($attrInstance->getBackend()->isStatic()) {
            $orderExpr = $entityField;
        } else {
            $this->_addAttributeJoin($attribute, 'left');
            if (isset($this->_joinAttributes[$attribute])||isset($this->_joinFields[$attribute])) {
                $orderExpr = $attribute;
            } else {
                $orderExpr = $this->_getAttributeTableAlias($attribute).'.value';
            }
        }

        if (in_array($attrInstance->getFrontendClass(), $this->_castToIntMap)) {
            $orderExpr = Mage::getResourceHelper('eav')->getCastToIntExpression(
                $this->_prepareOrderExpression($orderExpr)
            );
        }

        $orderExpr .= ' ' . $dir;
        $this->getSelect()->order($orderExpr);
    }
    return $this;
}

1

这是我的解决方案,用于对可配置产品的属性中的选项顺序进行排序。首先复制Collection.php,

app/code/core/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.phpapp/code/local/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php

然后,您可以找到以下代码:

foreach ($this->getProduct()->getTypeInstance(true)->getUsedProducts(array($productAttribute->getAttributeCode()), $this->getProduct()) as $associatedProduct) {

并替换为以下代码:

$assProds = $this->getProduct()->getTypeInstance(true)->getUsedProducts(array($productAttribute->getAttributeCode()), $this->getProduct());
sort($assProds);
foreach ($assProds as $associatedProduct) {

这将使您可以将属性选项的下拉列表按字母顺序排序。您也可以通过使用array_reverse()或类似功能来颠倒顺序。

以前,我的属性选项按相反的字母顺序排列。现在,它们按字母顺序排列。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.