Shopware 6:遍历产品时如何获取分类自定义字段
Shopware 6 获取产品关联分类的完整数据(含自定义字段)
核心思路
Shopware 6中获取分类数据,直接用CategoryRepository批量查询是最优方案,避免循环内单条查询拖慢性能。另外自定义字段默认不会自动加载,必须手动配置关联。
具体实现步骤
- 注入必要服务
在你的控制器或服务类中,注入分类仓库和销售渠道上下文(如果是前端插件,可通过事件上下文获取):
use Shopware\Core\Content\Category\CategoryRepositoryInterface; use Shopware\Core\System\SalesChannel\SalesChannelContext; class YourService { private CategoryRepositoryInterface $categoryRepository; public function __construct(CategoryRepositoryInterface $categoryRepository) { $this->categoryRepository = $categoryRepository; } public function processProducts(array $products, SalesChannelContext $context) { // 后续逻辑写在这里 } }
- 收集所有待查询的分类ID
先遍历产品集合,把所有categoryTree里的ID收集起来并去重,减少查询次数:
$allCategoryIds = []; foreach ($products as $product) { $categoryTreeIds = $product->getCategoryTree(); if (!empty($categoryTreeIds)) { $allCategoryIds = array_merge($allCategoryIds, $categoryTreeIds); } } // 去重,避免重复查询同一分类 $uniqueCategoryIds = array_unique($allCategoryIds);
- 批量查询分类数据(包含自定义字段)
用Criteria构建查询条件,明确关联自定义字段,确保能获取到对应数据:
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; $criteria = new Criteria($uniqueCategoryIds); // 必须添加自定义字段关联,否则无法获取自定义字段数据 $criteria->addAssociation('customFields'); // 可选:指定只加载需要的字段,减少数据传输量 // $criteria->addField(['id', 'name', 'customFields']); // 执行查询,传入销售渠道上下文 $categoryResult = $this->categoryRepository->search($criteria, $context->getContext()); // 把结果转成ID为键的数组,方便后续快速查找 $categoryMap = []; foreach ($categoryResult->getEntities() as $category) { $categoryMap[$category->getId()] = $category; }
- 遍历产品匹配分类数据
现在可以在产品循环里直接通过ID获取完整分类数据:
foreach ($products as $product) { $productCategoryIds = $product->getCategoryTree(); $productCategories = []; foreach ($productCategoryIds as $categoryId) { if (isset($categoryMap[$categoryId])) { $productCategories[] = $categoryMap[$categoryId]; // 直接获取自定义字段:$categoryMap[$categoryId]->getCustomFields() } } // $productCategories 即为当前产品关联的所有完整分类数据(含自定义字段) // 后续业务逻辑处理... }
注意事项
- 确保你要获取的自定义字段已经在Shopware后台的设置 > 自定义字段中配置到分类实体上,且目标分类已填写对应字段值。
- 若在Storefront模板中使用,建议通过订阅
ProductListingCriteriaEvent事件,提前给产品查询Criteria添加分类关联,避免在模板内执行查询操作。
内容的提问来源于stack exchange,提问作者AndreasDavid
相关产品推荐
相关产品推荐

