如何在Symfony2中设置多对多的表单

时间:2012-03-04 09:01:19

标签: symfony doctrine doctrine-orm symfony-forms

我有三个实体,ChannelEntity - > MatchChannelEntity< - MatchEntity,MatchChannelEntity保存其他两个表之间的多对多关系,我希望表单使用复选框列出所有通道,如果匹配有一个通道,则选择该通道的复选框,我怎样才能做到这一点 ?

以下是表单类型代码:

class MatchhType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('channels', 'entity', array('label' => 'Channels', 
                                          'class'         => 'Mikay\MikiBundle\Entity\Channel',
                                          'multiple'      => true,
                                          'expanded'      => true,
                                          'query_builder' => function ($repository) 
                                          { 
                                            return $repository->createQueryBuilder('c')->orderBy('c.name', 'ASC'); 
                                          },))

MatchChannel类型:

class MatchChannel
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var integer $match_id
     * @ORM\ManyToOne(targetEntity="Matchh", inversedBy="channels")
     * @ORM\JoinColumn(name="match_id", referencedColumnName="id", nullable="true")
     */
     private $match;

    /**
     * @var integer $channel_id
     *
     * @ORM\ManyToOne(targetEntity="Channel", inversedBy="mathces")
     * @ORM\JoinColumn(name="channel_id", referencedColumnName="id", nullable="true")
     */
   private $channel;

我将用一个例子来解释,比方说,我有三个频道:频道A,频道B和频道C,和一个匹配:匹配M,匹配M有一个频道A,这个关系保存在match_channel表中,我想要一个匹配表格来显示所有频道,并且频道A被选中,因为它由比赛M拥有,其他人保持未选中状态

2 个答案:

答案 0 :(得分:6)

好的,我将结束这个问题。那是因为我在两个表之间建立了多对多关系,并且正确的方法如下(我对代码进行了一些尝试):

多对多:一个匹配有多个频道,一个频道有很多匹配。

匹配度:

class Match
{
    /**
     * @ORM\ManyToMany(targetEntity="Channel", inversedBy="matches")
     * @ORM\JoinTable(name="match_channels")
     */
    private $channels;

频道:

class Channel
{
    /**
     * @ORM\ManyToMany(targetEntity="Match", mappedBy="channels")
     */
    private $matches;    

Doctrine将自动为您创建交叉引用表,名为MatchChannels。 注意 JoinTable 的声明,这非常重要。

完成后,您可以轻松创建多对多的表单,就像创建其他类型的表单/字段一样。

答案 1 :(得分:1)

我终于找到了解决方法。您可以查看源代码http://www.prowebdev.us/2012/07/symfnoy2-many-to-many-relation-with.html