Magento получит коллекцию товаров в произвольном порядке - PullRequest
5 голосов
/ 21 октября 2010

Я разработал специальную поисковую систему для нашего магазина Magento и пытаюсь загрузить коллекцию товаров в очень специфическом порядке (я оценил результаты в соответствии с разработанным мной алгоритмом).

Я могу правильно загрузить коллекцию товаров, но это не в том порядке, в котором я хотел бы, чтобы она находилась. Вот как это работает сейчас:

Мой запрос к базе данных в основном возвращается с PHP-массивом идентификаторов продуктов. Для этого примера скажем, что это выглядит так:

$entity_ids = array(140452, 38601 );

Теперь я могу транспонировать 140452 и 38601, и коллекция продуктов каждый раз возвращается в одном и том же порядке. Я хотел бы, чтобы коллекция продуктов находилась в том же порядке, что и идентификатор идентификатора объекта.

Код, который я использую для создания своей коллекции, выглядит следующим образом:

$products = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToSelect('*')
    ->addAttributeToFilter('entity_id', array('in' => $entity_ids))
    ->setPageSize($results_per_page)
    ->setCurPage($current_page)
    ->load();

Есть ли способ установить порядок сортировки в порядке массива $ entity_ids?

Ответы [ 2 ]

13 голосов
/ 21 октября 2010

Коллекции наследуются от класса

Varien_Data_Collection_Db

В этом классе есть метод с именем addOrder.

public function addOrder($field, $direction = self::SORT_ORDER_DESC)
{
    return $this->_setOrder($field, $direction);
}

Итак, вы думаете, что-то вроде этого должно работать для базового заказа

Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addOrder('entity_id');

Однако это не так. Из-за сложного объединения, включенного в Коллекции EAV, существует специальный метод, используемый для добавления атрибута в предложение order

Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection::addAttributeToSort

Однако, опять же, это можно использовать только для добавления простых атрибутов. Чтобы создать произвольную сортировку, вам нужно напрямую манипулировать объектом Zend_Select. Я не большой поклонник этого, и я не большой поклонник использования пользовательских функций mysql для достижения целей, но, похоже, это единственный способ сделать это

Я протестировал следующий код на стандартной установке и получил желаемые результаты. Вы должны быть в состоянии использовать его, чтобы получить то, что вы хотите.

        $ids = array(16,18,17,19);
        $products = Mage::getModel('catalog/product')->getCollection()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('entity_id',$ids);           

                    //shakes fist at PDO's array parameter
                    $ids = array_map('intval', $ids);
        $products->getSelect()->order("find_in_set(e.entity_id,'".implode(',',$ids)."')");
        foreach($products as $product)
        {
            var_dump($product->getEntityId());
            var_dump($product->getSku());
        }
1 голос
/ 22 октября 2010

Нет способа произвольной сортировки в SQL, поэтому вам придется сортировать результаты в PHP впоследствии.Тогда большая проблема заключается в том, что вы используете размер страницы для ограничения количества возвращаемых результатов, поэтому некоторые записи, которые вы хотите, не могут быть возвращены из-за этого.

Лучшее решение - добавить атрибут к продуктам,затем вы можете использовать для сортировки.Продукты в категориях уже имеют значение «позиция», которое используется таким образом.Тогда вам нужно использовать только метод addOrder()addAttributeToSort(), предложенный Аланом, но с вашим пользовательским атрибутом.

(Объяснение спешит, дайте мне знать, если не достаточно ясно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...