Symfony实体类型中的树结构

时间:2016-12-22 08:30:39

标签: php sql symfony

我的表格看起来像这样

categories:
- id
- name
- parent

在我的表单中,您可以选择多个类别。我正在将此代码用于表单构建器

->add('categories', EntityType::class, [
            'class' => 'AppBundle:CourseCategory',
            'choice_label' => function(CourseCategory $category) {
                return \AppBundle\Helper::categoryIndent($category) . ' ' . $category->getName();
            },
            'multiple' => true,
            'expanded' => true,
            'query_builder' => function(EntityRepository $er) {
                return $er
                        ->createQueryBuilder('u')
                        ->orderBy('u.parent');
            },
            'choice_attr' => function($category, $key, $index) {
                $attrs = [];

                $attrs['data-id'] = $category->getId();
                $attrs['class']   = 'tree-item';

                if($category->getParent() != null) {
                    $attrs['data-parent'] = $category->getParent()->getId();
                }

                return $attrs;
            }
        ])

到目前为止,这不起作用,因为orderBy语句错误...

如何在这里获得递归树结构?

修改

我想要实现的目标如下:

Category
    Subcategory 1
    Subcategory 2
        Sub-subcategory 1
    Subcategory 3
Category
    Subcategory

知道树木的深度。

1 个答案:

答案 0 :(得分:1)

我知道这个问题很旧,但是也许有人仍然可以从我的答案中受益。

在显示树时,必须在我的示例下面按“左”顺序对其进行排序:

->add('parent', EntityType::class,
                    array(
                        'class'         => Menu::class,
                        'choice_label' => function(Menu $menu) {
                            return TreeHelper::getIndentForTreeElement($menu) . ' ' . $menu->getTitle();
                        },
                        'query_builder' => function(EntityRepository $em) {
                            return $em->createQueryBuilder('t')->orderBy('t.lft', 'ASC');
                        }
                    )
                )

树的深度或父ID无关紧要,只要树的左右值正确构建即可。