如何为指定类目构建带选项的属性组查询条件?
问题分析与解决方案
你当前的查询失败核心原因是关联路径错误,Shopware 6中属性组(PropertyGroup)与类目(Category)为直接多对多关联,无需通过选项(PropertyGroupOption)的productProperties层级去过滤。以下是修正后的实现方案:
修正后的查询代码
$config = $slot->getFieldConfig(); if (! $selectedProperties = $config->get('selectedProperties')) { return null; } $selectedPropertyIds = $selectedProperties->getValue(); $targetCategoryId = '16561f02419949feb5ac61a4ee6c6211'; // 初始化查询条件:优先使用选中的属性组ID,否则查询所有 $criteria = $selectedPropertyIds ? new Criteria($selectedPropertyIds) : new Criteria(); // 关联属性组选项,并按选项名称升序排序 $criteria->addAssociation('options'); $criteria->getAssociation('options')->addSorting(new FieldSorting('name', FieldSorting::ASCENDING)); // 过滤指定类目下的属性组 $criteria->addFilter(new EqualsFilter('categories.id', $targetCategoryId)); // 过滤掉无选项的属性组(可选,按需开启) $criteria->addFilter(new NotNullFilter('options.id')); // 执行查询(需注入PropertyGroupRepository) $propertyGroups = $this->propertyGroupRepository->search($criteria, $context)->getElements();
关键修正点
- 关联路径修正:直接通过
categories.id过滤属性组所属类目,无需绕到选项的关联层级 - 空选项过滤:通过
NotNullFilter确保返回的属性组都有可用选项,避免渲染空内容 - 逻辑一致性:保留原有的选中属性组ID过滤逻辑,同时叠加类目过滤,确保只返回符合双重条件的属性组
前端hover菜单实现思路
拿到查询后的$propertyGroups数据后,可渲染成如下结构(示例):
<div class="menu-item"> <a href="#">Wine</a> <div class="submenu"> <?php foreach ($propertyGroups as $group): ?> <div class="property-group"> <h4><?= $group->getName() ?></h4> <ul> <?php foreach ($group->getOptions() as $option): ?> <li><a href="#"><?= $option->getName() ?></a></li> <?php endforeach; ?> </ul> </div> <?php endforeach; ?> </div> </div>
再通过CSS实现hover显示子菜单:
.submenu { display: none; position: absolute; top: 100%; left: 0; gap: 2rem; padding: 1rem; background: #fff; box-shadow: 0 2px 8px rgba(0,0,0,0.1); } .menu-item { position: relative; } .menu-item:hover .submenu { display: flex; }
内容的提问来源于stack exchange,提问作者Marcin Puszka
相关产品推荐
相关产品推荐

