Symfony2:在实体字段中使用group_by选项

时间:2013-01-24 01:46:39

标签: symfony doctrine-orm symfony-2.1

我正在尝试在Symfony 2.1中显示带有optgroups的选择框。 我的实体树是:客户有项目,项目有部分(Part->getProject()->getClient()

我想以这种方式显示我的选择框:

<select>
    <optgroup>Client name
        <option>Part name</option>
        <!-- ... -->
    </optgroup>
    <!-- ... -->
</select>

Symfony doc没有太多帮助。 我的工作表单构建器(没有group_by选项)为我提供了一个简单的选择:

$this->createFormBuilder()
->add('part','entity',array(
    'class'         => 'SGLFLTSPartBundle:Part',
    'property'      => 'name',
    'query_builder' => function (\SGL\FLTS\PartBundle\Entity\PartRepository $er) {
        return $er->createQueryBuilder('p');
    }))
->getForm();

如何添加group_by选项以显示客户端名称?到目前为止我已经尝试了

'group_by'      => 'project.client.name'
'group_by'      => 'project.client'
'group_by'      => 'ppc.name' // the DQL table alias

所有提供PHP错误

我还尝试将项目名称仅显示为optgroup,没有运气:

'group_by'      => 'project'
'group_by'      => 'project.name'
'group_by'      => 'project.id'   // throws no error, giving me <optgroup label="1"> ...

并尝试在createQueryBuilder中添加项目/客户端连接

$er->createQueryBuilder('p')->select('p, pp')->leftJoin('p.project','pp');
$er->createQueryBuilder('p')->select('p, pp.name')->leftJoin('p.project','pp')
// wrong

谢谢!

1 个答案:

答案 0 :(得分:6)

今天我遇到了类似的问题。

我想你已经看到很多与错误使用Objects作为数组键有关的PHP错误了?这是由Symfony尝试将整个相关对象用作分组结果数组中的数组键引起的。

我需要进一步研究它以获得更好的解决方案,但与此同时这就是我正在使用的......

向名为Part的{​​{1}}实体添加一个新方法,如下所示:

getClientName

在表单字段构建器中将public function getClientName() { // safety measure in-case a part hasn't been assigned to a project if (null === $this->getProject()) { return null; } // safety measure in-case a project hasn't been assigned to a client if (null === $this->getProject()->getClient()) { return null; } return $this->getProject()->getClient()->getName(); } 选项设置为group_by

clientName

使用这个额外方法背后的想法是给Symfony一个类方法,它可以调用它来获取一个字符串值来执行分组。

如果其他人有更优雅的解决方案,我会热衷于看到它。