使用基于3向实体关系的optgroups / options构建选择

时间:2014-01-21 09:42:59

标签: symfony doctrine-orm

嗯,标题不是很明确,但很难用一句话来解释我的问题。

我正在使用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'

1 个答案:

答案 0 :(得分:0)

好的,我终于明白了!

在我的Baz实体中,我添加了此方法:

getFirstBar() {
    return $this->bars->first();
}

在我的字段的选项数组中,我添加了这个选项:

$options['group_by'] = 'firstBar.name'

现在我有一个<select>我的所有bazsbar分组:)