Symfony2 表单:显示 select 基于底层数据(多对多)

Symfony2 Form: Show select based on underlying Data (many-to-many)

我有三个实体:

class Product {
    /**
     * @ORM\ManyToMany(targetEntity="Colour")
     * @ORM\JoinTable(name="Product_Colour",
     *      joinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="colour_id", referencedColumnName="id")}
     * )
     */
    protected $colours;
}

class Colour {
    /**
     * @ORM\ManyToMany(targetEntity="Product", mappedBy="colours")
     **/
    protected $products;
}

class BasketProduct {
    /**
     * @ORM\ManyToOne(targetEntity="Colour")
     * @ORM\JoinColumn(name="colour_id", referencedColumnName="id")
     **/
     private $colour;

    /**
     * @ORM\ManyToOne(targetEntity="Product")
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id")
     */
    protected $product;
}

颜色有很多种。每个产品都可以有多种颜色。

通过 Link 我可以将产品添加到我的 BasketProduct 中,在下一步中我可以 select BasketProduct 的颜色。我需要的是一种将颜色 select 字段限制为产品可用颜色的方法。 这是我的尝试,但它向我展示了所有颜色:

$builder->add('colour', 'entity', array('class' => 'Colour',
                                            'query_builder' => function(EntityRepository $er) {
                                                                    return $er->createQueryBuilder('u')
                                                                            ->select('u','i')
                                                                            ->leftJoin('u.products','i');
                                                                },
                                        ));

非常感谢您提供解决方案!谢谢! :)

    $builder->add('colour', 'entity', array('class' => 'Colour',
        'query_builder' => function(EntityRepository $er) {
            return $er->createQueryBuilder('c')
                ->select('c')
                ->join('c.products','p');
        },
    ));

编辑:修复拼写、连接方法(而不是 'Join')

innerJoin 只接受与产品相关联的颜色:

$builder->add('colour', 'entity', array('class' => 'Colour',
        'query_builder' => function(EntityRepository $er) {
            return $er->createQueryBuilder('c')
                ->select('c')
                ->innerJoin('c.products','p');
        },
    ));