Symfony2表单:根据基础数据显示选择(多对多)

时间:2015-03-26 17:42:17

标签: forms symfony doctrine many-to-many limit

我有三个实体:

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;
}

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

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

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

非常感谢解决方案!谢谢! :)

2 个答案:

答案 0 :(得分:3)

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

编辑:修复拼写,加入方法(而不是“加入”)

答案 1 :(得分:-1)

innerJoin仅采用与产品相关联的颜色:

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