嗯,标题不是很明确,但很难用一句话来解释我的问题。
我正在使用Symfony 2和Doctrine。
我想要的东西似乎并不复杂,但我无法得到它。 (虽然,我已经解决了比这个更复杂的问题......)
这是我的Foo
实体。一个Foo
可以有多个Bar
,但Bar
只有一个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
实体实例,我怎样才能得到一个<select>
,其中包含Baz
Foo
Bar
,按<optgroup>
分组{ {1}}),最少有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())
;
}
));
几乎可以。现在,我有一个包含与当前baz
关联的所有foo
的选择。但我不能按Bar
分组。
我在很多方面尝试了group_by
选项,但没有任何作用:
'group_by' => 'bars.name'
'group_by' => 'bar.name'
'group_by' => 'r.name'
答案 0 :(得分:0)
好的,我终于明白了!
在我的Baz
实体中,我添加了此方法:
getFirstBar() {
return $this->bars->first();
}
在我的字段的选项数组中,我添加了这个选项:
$options['group_by'] = 'firstBar.name'
现在我有一个<select>
我的所有bazs
按bar
分组:)