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');

回答:


42

EAVコレクションは属性で機能し、並べ替え方法はここでも少し異なります

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

非EAVコレクションの場合、次のいずれかの方法を使用します

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

2番目のコレクションはどうですか?
easymoden00b 2015年

これはフラットタイプのコレクションなので、EAVと属性はありません。並べ替えの方法については、この回答を
ご覧

私はsetOrder( 'related_sku'、 'DESC');を試しました。しかし、それはソートされていません。
easymoden00b 2015年

私は自分の回答を編集しました
サンダーマンゲル

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


3

ここで他の答えを拡張するには、$kitCollection->getSelect()->order('column DESC')問題ありませんが、複数の列を追加することはできません。たとえば、$kitCollection->getSelect()->order('column DESC, column2 ASC')エラーになります。これは、Magentoが列名をエスケープするために行う作業のためです。これを回避するには、次のZend_Db_Exprように使用できます。

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

1

easymoden00bは、setOrder()製品のEav構造が原因で機能していません。@ SandeがaddAttributeToSort()関数を使用すると言っているように、

  • Magento is join multiple tables for product collection.

  • Attribute alias name at collection

  • setOrder() functionorder expression Fieldname、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()または同様の関数を使用して順序を逆にすることもできます。

以前は、私の属性オプションはアルファベットの逆順でした。現在、アルファベット順になっています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.