基于3向实体关系,使用OptGroup/选项构建选择



好吧,标题并不是真正明确的,但是很难用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>,所有我的bazsbar分组:)

相关内容

  • 没有找到相关文章

最新更新