5

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

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

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

+--------------+-----------+--------+
| section_id   | parent_id | title  |
+--------------+-----------+--------+
|            1 |      NULL | Parent |
+--------------+-----------+--------+
|            2 |          1| Child  |
+--------------+-----------+--------+
|            3 |          2| Nephew |
+--------------+-----------+--------+

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

Parent
Parent/Child
Parent/Child/nephew

使用单个 SQL 选择不容易完成,因此我需要一种方法来获取选项并按此“路径”进行简单排序。

4

3 回答 3

7

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

/**
 * @ManyToMany(targetEntity="Group")
 * @OrderBy({"name" = "ASC"})
 **/
private $groups;

更多信息:订购多对关联

于 2013-10-08T13:49:14.500 回答
4

如果我正确理解了 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());
    });
}

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

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);
    });
}
于 2014-12-15T02:17:33.433 回答
1

我建议在您的部分添加一个“路径”字段。只要你打电话$parent->addChild($child),我就会设置$child->path$parent->path . $child->path. 如果要在 sql 中进行过滤,这是唯一的方法。

您还可以考虑使用使用嵌套集的树扩展,以提高此类操作的性能: https ://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/tree.md

于 2013-10-08T21:08:50.603 回答