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

时间:2013-10-03 11:05:45

标签: symfony doctrine-orm symfony-2.1 symfony-forms

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

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

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

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

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

Parent
Parent/Child
Parent/Child/nephew

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

3 个答案:

答案 0 :(得分:6)

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

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

更多信息:Ordering To-Many Associations

答案 1 :(得分:3)

如果我正确理解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。

答案 2 :(得分:0)

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

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