【问题标题】:Tree structure in Symfony's Entity TypeSymfony 实体类型中的树结构
【发布时间】:2017-05-07 19:42:45
【问题描述】:

我的桌子是这样的

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),但会很痛苦。
  • 已编辑条目。
  • 尝试将 'group_by' => 'parent' 添加到您的类型选项中,其中 parent 是您实体中的字段名称。
  • 尝试添加group_by,但还是不行。顺序完全错误(它是类别 1、类别 2、子类别 1、子类别 2、子子类别 1)。
  • 您为什么要通过u.parent 订购?我猜你可能想按身份证或姓名订购?不是吗?

标签: php sql symfony


【解决方案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 就无关紧要。

【讨论】:

    猜你喜欢
    • 2017-05-14
    • 1970-01-01
    • 2016-03-20
    • 2018-06-03
    • 2016-06-26
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    相关资源
    最近更新 更多