使用Symfony表单构建器在选择选项中显示已连接的字段数据

时间:2013-03-01 18:50:00

标签: symfony join doctrine-orm formbuilder

我正在尝试制作一个表格,用于将比赛结果添加到一个事件中,但是无法弄清楚如何在一个选择框的选项中显示连接在一起的表格中的信息。

这是我的数据库结构:

人员表:

id | name
----------
1  | fred
2  | dave
3  | james

参赛者表(代码是参赛者的比赛号码 - 你给衬衫钉的那种东西):

id | code | person_id | category_id
---------------------------------
1  | 210  | 1         | 1
2  | 211  | 2         | 1
3  | 212  | 3         | 1
4  | 156  | 1         | 2
6  | 157  | 3         | 2

结果表:

id | time | entrant_id
---------------------
1  | 1:20 | 1
2  | 1:35 | 2
3  | 2:02 | 3

将结果添加到Category = 1时的所需输出:

<select>
    <option>210 - Fred</option>
    <option>211 - Dave</option>
    <option>212 - James</option>
</select>

我目前在ResultType中获得的代码只为person.name提供了一个良好的开端(以每个名称1个额外查询为代价)但不是entrant.code:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('time')
        ->add('entrant', 'entity', array(
            'class'=>'KP\EventsBundle\Entity\Entrant', 
            'property' => 'person.name',
            ));
}

如何在同一个选项列表中同时获取entrant.code和person.name?

我只使用Symfony几周了,所以请温柔地对待我。

1 个答案:

答案 0 :(得分:0)

我想出的最简单的方法是在__toString()类中实现Entrant方法:

public function __toString()
{
    return sprintf("%d %s", $this->code, $this->person->getName());
}

从表单类型的property字段中删除entrant选项,以使其使用该方法。

要解决额外的查询问题,您可以在query_builder类型的entity选项中执行fetch join