Symfony 4中如何将分类按父分类名称分组显示?
解决Symfony EntityType按父分类名称分组并格式化子分类的问题
这个需求很容易实现,只需要调整EntityType的group_by和choice_label配置,再配合查询排序就能达到你想要的效果。具体步骤如下:
1. 核心配置修改
在你的FormType中,把原来的group_by改为按父分类名称分组,同时给子分类名称添加前缀--:
->add('category', EntityType::class, [ 'class' => Category::class, // 给子分类名称添加--前缀 'choice_label' => function(Category $category) { return '--' . $category->getName(); }, // 按父分类的名称分组,替代原来的parent_id 'group_by' => function(Category $category) { // 处理可能存在的无父分类情况,可根据需求调整默认文本 $parentCategory = $category->getParent(); return $parentCategory ? $parentCategory->getName() : '未分类'; }, // 排序:先按父分类名称升序,再按子分类名称升序,保证展示顺序整齐 'query_builder' => function (EntityRepository $er) { return $er->createQueryBuilder('c') ->leftJoin('c.parent', 'p') ->orderBy('p.name', 'ASC') ->addOrderBy('c.name', 'ASC'); }, ])
2. 必要的实体方法检查
确保你的Category实体中存在获取父分类的方法:
// Category.php public function getParent(): ?ParentCategory { return $this->parent; }
同时ParentCategory实体要有获取名称的方法:
// ParentCategory.php public function getName(): string { return $this->name; }
3. 效果说明
配置完成后,渲染出的表单会自动按父分类名称(如Якета、Блузи)分组,每个分组下的子分类名称前会加上--,完全符合你想要的格式:
Якета
--Пролетни
--Зимни
--Жилетки
Блузи
--Тениски
--Ризи
--Дълъг ръкав
Панталони
--Къси
--Дълги
--Дънки
如果遇到无父分类的子分类,会自动归到未分类分组下,你可以根据实际业务需求修改这个默认文本。
内容的提问来源于stack exchange,提问作者Борислав Якимов
相关产品推荐
相关产品推荐

