Получить коллекцию категорий из идентификатора продукта


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

$product = $this->_productFactory->create()->getCollection()->load($pid);
$cats = $product->getCategoryIds();
if(count($cats) ){
    $firstCategoryId = $cats[0];
    $_category = $this->_categoryFactory->create()->getCollection()->load($firstCategoryId);
    return $_category->getName();
}
Author: grg, 2016-03-28

4 answers

$product = $this->_productFactory->create()->load($pid);
$cats = $product->getCategoryIds();
if(count($cats) ){
    $firstCategoryId = $cats[0];
    $_category = $this->_categoryFactory->create()->load($firstCategoryId);
    return $_category->getName();
}
 6
Author: Sohel Rana, 2018-01-16 19:53:54

Обратите внимание, что все приведенные выше ответы на самом деле не являются правильным способом сделать это в Magento 2. Magento 2 представил сервисные контракты и модели данных как новый способ получения такого рода данных.

Например, $model->load() устарел с 2.1, и коллекции должны быть заменены репозиториями, и это единый getList() - метод, который использует критерии поиска.

Способ извлечения категорий Magento в соответствии с идентификатором продукта будет следующим:

// Get a product Data Model from the repository:
$product = $this->productRepository->getById($productId);

// Fetch the 'category_ids' attribute from the Data Model.
if ($categoryIds = $product->getCustomAttribute('category_ids')) {
    foreach ($categoryIds->getValue() as $categoryId) {
        $category = $this->categoryRepository->get($categoryId);
    }
}
 10
Author: Giel Berkers, 2016-12-16 13:09:07

Вам не нужно загружать всю категорию, которая выполняет слишком много sql-запросов.

/** @var \Magento\Catalog\Api\CategoryAttributeRepositoryInterface $this->categoryAttributeRepository */
$nameAttribute = $this->categoryAttributeRepository->get('name');

/** @var \Magento\Catalog\Model\ResourceModel\Category $categoryResource */
$categoryResource = $this->categoryResourceFactory->create();
$value = $categoryResource->getAttributeRawValue(
    $categoryId,
    $nameAttribute,
    $this->storeManager->getStore()
);

// Additionally for other types of attributes (select, multiselect, ..)
$category = $this->categoryFactory->create();
$category->setCategoryId($categoryId);
$category->setData('name', $value);

// Final value as seen on frontend
$mixed = $nameAttribute->getFrontend()->getValue($category);
 5
Author: Daniel Ifrim, 2016-03-28 20:21:03

Как вы использовали getCollection() для $this->_categoryFactory->create()->getCollection()->load($firstCategoryId);, чтобы $_category дана коллекция категорий вместо одного объекта категории

В вашем случае используйте имя категории из $_category добавить getFirstItem();

return   $_category->getFirstItem()->getName();
 1
Author: Amit Bera, 2016-03-28 09:12:53