首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Symfony -使用递归表在ChoiceType上创建组

Symfony -使用递归表在ChoiceType上创建组
EN

Stack Overflow用户
提问于 2020-07-31 23:30:52
回答 1查看 107关注 0票数 0

我有一个实体‘主题’本身的引用。简而言之,一个“主题”可以有一个“主题”父级。它只能有一个级别。

请看我的表格:

我想要以下结果

我在类型中进行了自定义查询,但它不起作用。

代码语言:javascript
运行
复制
->add('theme',
EntityType::class,
[
    'class' => Theme::class,
    'query_builder' => function (ThemeRepository $repo) use ($options) {
        $query = $repo->createQueryBuilder('p');
        $query->leftJoin(
            Theme::class,    // Entity
            'c',               // Alias
            Join::WITH,        // Join type
            'p.parent = c.id' // Join columns
        );
        $query->where($query->expr()->isNotNull('p.parent'))
            ;
        return $query;
    },
    'group_by' => 'name',
    'choice_label' => 'name',
]);

我能得到的最好的结果是:

也许问题出在"group_by“或"choice_label”属性上,因为实际上它是具有不同角色的相同column...but :)

你能帮我吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-01 05:29:59

在您的情况下,"group_by“选项是很好的选择。但您必须按父名称分组,而不是按当前条目名称分组。如果你看一下这个选项https://symfony.com/doc/current/reference/forms/types/choice.html#group-by的文档,你会发现你可以在这里回调!

答案应该是这样的:

代码语言:javascript
运行
复制
[
    // ... Your other options
    'group_by' => ($choice, $key, $value) {
        if (!$choice instanceof Theme) {
            return null;
        }

        return $choice->getParent()->getName();
    }
]

我不记得在这里是否必须使用$choice或$value参数,但我认为这在这里并不重要,因为它是一个EntityType。如果你的主题没有父主题,可能需要额外的检查。

此外,在这里使用Doctrine会有很多自动查询,因为您没有在查询结果中添加父元素。为了避免这种情况,您可以使用->addSelect('c')来完成您的查询(尽管您的别名在这里似乎很奇怪)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63194817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档