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

แล้วคอลเล็กชันที่สองล่ะ
easymoden00b

นั่นเป็นคอลเล็กชันประเภทแฟลตดังนั้นไม่มี EAV และแอตทริบิวต์ ลองดูที่คำตอบนี้เกี่ยวกับวิธีการจัดเรียง: stackoverflow.com/a/11354060
Sander Mangel

ฉันลอง setOrder ('related_sku', 'DESC'); แต่มันไม่ได้จัดเรียง
easymoden00b

ฉันได้แก้ไขคำตอบของฉัน
Sander Mangel

2
@ easymoden00b ใช้สิ่งนี้$kitCollection->getSelect()->order('related_sku DESC');
Priyank

15

คุณสามารถเพิ่มการเรียงลำดับแบบนี้:

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

ข้อมูลเพิ่มเติม: http://www.magentocommerce.com/wiki/1_-_installation_and_configuration/using_collections_in_magento

หวังว่าจะช่วยคุณได้


3
แก้ไขให้ฉันเพราะฉันใช้เหมือน->order('related_sku', 'desc');
Ricky Odin Matthews

3

หากต้องการขยายคำตอบอื่น ๆ ที่นี่$kitCollection->getSelect()->order('column DESC')ทำได้ดี แต่คุณไม่สามารถเพิ่มมากกว่าหนึ่งคอลัมน์ ตัวอย่างเช่น$kitCollection->getSelect()->order('column DESC, column2 ASC')จะเกิดข้อผิดพลาด นี่เป็นเพราะงานที่วีโอไอพีทำเพื่อหลบหนีชื่อคอลัมน์ ในการหลีกเลี่ยงสิ่งนี้คุณสามารถใช้สิ่งต่อไป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() functionคือการทำงานเมื่อมันorder expression Fieldname, sortordercorrectคือ

คุณสามารถเห็นได้ว่าวีโอไอพีสร้างนามแฝงของฟิลด์ได้อย่างไรและเกี่ยวข้องกับแอตทริบิวต์ตาราง eav ที่คลาส Mage_Eav_Model_Entity_Collection_Abstract

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.