好吧,标题并不是真正明确的,但是很难用1个句子来解释我的问题。
我正在将Symfony 2与学说一起使用。
我想要的东西似乎并不复杂,但我无法理解。(不过,我已经解决了似乎比这个问题要复杂得多的问题...
这是我的Foo
实体。一个Foo
可以具有多个Bar
,但是Bar
只有1个Foo
。
class Foo
{
/**
* @OneToMany(targetEntity="Bar", mappedBy="foo")
*/
private $bars;
}
这是我的Bar
实体。它有1个Foo
。它可以具有多个Baz
,并且Baz
可以属于许多Bar
:
class Bar
{
/**
* @ManyToOne(targetEntity="Foo", inversedBy="bars")
*/
private $foo;
/**
* @ManyToMany(targetEntity="Baz")
* @JoinTable(name="BarsBazs")
*/
private $bazs;
}
最后,这是Baz
实体。它属于一个或多个Bar
:
class Baz
{
}
如果我有一个Foo
实体实例,如何获得包含Foo
的所有Baz
的<select>
,由Bar
分组(带有<optgroup>
),并使用DB请求最少?
编辑:
好吧,我走得更远。
我的Bar
实体现在是:
class Bar
{
/**
* @ManyToOne(targetEntity="Foo", inversedBy="bars")
*/
private $foo;
/**
* @ManyToMany(targetEntity="Baz", inversedBy="bars")
* @JoinTable(name="BarsBazs")
*/
private $bazs;
}
我的Baz
实体现在是:
class Baz
{
/**
* @ManyToMany(targetEntity="Bar", mappedBy="bazs")
*/
private $bars;
}
在我的表单构建器中,添加字段时,我将其设置为($ foo包含我的Foo
实体实例):
$builder->add('baz', 'entity', array(
'property' => 'name',
'query_builder' => function($repository) use ($foo) {
return $repository->createQueryBuilder('z') // Baz
->addSelect('r') // Bar
->join('z.bars', 'r')
->where('r.foo = :fooId')
->setParameter('fooId', $foo->getId())
;
}
));
几乎可以。现在,我有一个选择了与当前foo
关联的所有baz
。但是我不能按Bar
进行分组。
我在许多方面尝试了group_by
的选项,但没有任何作用:
'group_by' => 'bars.name'
'group_by' => 'bar.name'
'group_by' => 'r.name'
好吧,我终于明白了!
在我的Baz
实体中,我添加了此方法:
getFirstBar() {
return $this->bars->first();
}
和在我字段的选项阵列中,我添加了此选项:
$options['group_by'] = 'firstBar.name'
现在,我有一个<select>
,所有我的bazs
由bar
分组:)