如何在Symfony中对实体类型字段进行排序(不使用query_builder选项)?

gre*_*emo 4 symfony-forms symfony doctrine-orm symfony-2.1

我需要自定义实体类型字段,但没有query_builder选项.我需要根据数据库级别不可用的一些信息对其进行排序(因此,不使用query_builder).

有没有办法可以对<select>窗口小部件的元素进行排序?

编辑:我的表中有parent自我关联section,其中还包含一个title属性:

+--------------+-----------+--------+
| section_id   | parent_id | title  |
+--------------+-----------+--------+
|            1 |      NULL | Parent |
+--------------+-----------+--------+
|            2 |          1| Child  |
+--------------+-----------+--------+
|            3 |          2| Nephew |
+--------------+-----------+--------+
Run Code Online (Sandbox Code Playgroud)

我想显示一个选择框,其中的项目按标题和ancerstor标题的串联排序,即:

Parent
Parent/Child
Parent/Child/nephew
Run Code Online (Sandbox Code Playgroud)

使用单个SQL select不容易实现,因此我需要一种方法来获取选项并通过此"路径"进行简单排序.

Bab*_*aga 6

您可以通过执行以下操作对实体中的关系进行默认排序:

/**
 * @ManyToMany(targetEntity="Group")
 * @OrderBy({"name" = "ASC"})
 **/
private $groups;
Run Code Online (Sandbox Code Playgroud)

更多信息:订购To-Many协会


Hen*_*nry 5

如果我正确理解OP,排序只是为了显示选择的选项,以便用户受益。

向您的表单类型添加一个函数,如下所示:

public function finishView(FormView $view, FormInterface $form, array $options)
{
    usort($view->children['select']->children, function(FormView $a, FormView $b) {
        return strcasecmp($a->vars['value']->getFullTitle(), $b->vars['value']->getFullTitle());
    });
}
Run Code Online (Sandbox Code Playgroud)

此示例假设getFullTitle()您的实体上存在一个函数,该函数可以生成用于排序比较的值。select将是选择框所基于的关系的字段名称。

5年后...

在 Symfony 4 中再次尝试我自己的解决方案,这似乎不起作用。

这是有效的解决方案:

public function finishView(FormView $view, FormInterface $form, array $options)
{
    usort($view->children['select']->vars['choices'], function(ChoiceView $a, ChoiceView $b) {
        return strcasecmp($a->label, $b->label);
    });
}
Run Code Online (Sandbox Code Playgroud)