Наиболее эффективный способ получения продукта высшей категории самого высокого уровня


Если у меня есть экземпляр модели продукта, каков наиболее эффективный способ получить категорию самого высокого уровня, т.е. наиболее близкую к корневой для этого продукта?

Если товар относится к следующим категориям, мне нужен идентификатор категории

CategoryA
    CategoryC
    CategoryD
        CategoryB
            CategoryE
    CategoryF
        CategoryG
Author: Marty Wallace, 2013-06-06

3 answers

Как насчет

$topCategory = Mage::getResourceModel('catalog/category_collection')
    ->addIdFilter($product->getCategoryIds())
    ->setOrder('level', 'ASC')
    ->setPage(1,1)
    ->getFirstItem();

Это даст вам простой запрос к таблице сущностей каталога с сортировкой по индексированному столбцу.
Если вам нужно больше атрибутов, загруженных в категорию, используйте addAttributeToSelect() в коллекции перед вызовом getFirstItem().

Не забывайте, что ->setPage(1,1) без этого ограничения загружаются все категории.

 8
Author: Vinai, 2013-12-11 10:32:25
    $categoryIds  = $product->getCategoryIds();
    $categories   = Mage::getResourceModel('catalog/category_collection');
    $mainCategory = null;
    foreach ($categoryIds as $id) {
        $category     = $categories->getItemById($id);
        $parents      = explode('/', $category->getPath());
        $mainCategory = (count($parents) > 2) ? $parents[2] : $parents[1];
    }
    //$mainCategory - category after store root category.
 0
Author: mageUz, 2013-06-06 14:07:29

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

$topCategory = Mage::getResourceModel('catalog/category_collection')
    ->addIdFilter($product->getCategoryIds())
    ->addFieldToFilter('parent_id', array('eq' => '2')); 
 0
Author: Vedran Subotić, 2013-12-11 10:26:48