我需要自定义 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选择不容易实现,因此我需要一种方法来获取选项并通过此“路径”进行简单排序。
答案 0 :(得分:6)
您可以通过执行以下操作对实体中的关系进行默认排序:
/**
* @ManyToMany(targetEntity="Group")
* @OrderBy({"name" = "ASC"})
**/
private $groups;
答案 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