Я не могу отсортировать коллекцию продуктов по идентификатору категории

У меня есть несколько категорий: парни, дамы, мужчины, женщины и предложения.

Каждый продукт относится к категориям парней, дам, мужчин ИЛИ женщин.

А некоторые товары отнесены к категории «предложения».

Мне нужно получить все продукты «предложения», но отсортировать по другим категориям, я имею в виду:

ПРЕДЛОЖЕНИЯ -> товары для мужчин -> товары для женщин -> товары для мужчин -> товары для женщин

$collection = Mage::getResourceModel('catalog/product_collection')
        ->addAttributeToSort('category_ids', 'ASC')
        ->addAttributeToSelect(array('name', 'sku', 'status', 'visibility', 'is_saleable'));

    foreach ($_productCollection as $_product) {
        echo "<!-- "  . $_product->getName() . '-->';
    }

Прямо сейчас я получаю продукты для отображения по категории «предложения», но эти продукты упорядочены по атрибуту имени, и мне нужны эти продукты, отсортированные по категории перед именем.

Как я могу этого добиться?


person iVela    schedule 23.07.2012    source источник
comment
Я вижу два способа добиться этого, но ни один из них не является красивым. Либо получите 4 разные коллекции для каждой из ваших вторичных категорий, либо просмотрите свою коллекцию, запросите категории для каждого продукта, а затем отсортируйте свою коллекцию.   -  person user487772    schedule 24.07.2012


Ответы (1)


Следующий запрос вернет все продукты и соединит их с таблицей соотношений категорий и продуктов. Он также сортирует записи по category_id и позиции в категории.

SELECT `e`.* 
FROM `catalog_product_entity` AS `e` 
LEFT JOIN catalog_category_product ON(entity_id=product_id)
ORDER BY category_id AND position;

Единственное, что может случиться, это то, что вы столкнетесь с дубликатами товаров, поскольку товары могут относиться к категории товаров для женщин и женщин. Хотя этого можно просто избежать, удалив x.catetgory_id из запроса и добавив DISTINCT для фильтрации дубликатов.

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

$collection = Mage::getResourceModel('catalog/product_collection')
    ->addAttributeToSelect('*')
    ->joinTable('catalog/category_product', 'entity_id=product_id', array('product_id' => 'product_id'), null, 'left')
    ->addAtributeToSort('category_id');
person Tim Hofman    schedule 23.07.2012