How to setup a many to many form in Symfony2

18,231

Ok, I will close this question. That's because I set up the many to many relation between the two tables wrong, and the correct way is as following(I trimed the code a bit):

Many to many: One match has many channels and one channel has many matches.

Match:

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

Channel:

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

Doctrine will automatically create the cross reference table for you, named MatchChannels. Note the JoinTable annonation, it is very important.

And when you done, you can create a many to many form easily, just like you create other type of forms/fields.

Share:
18,231
imikay
Author by

imikay

twitter:@imikay facebook: https://www.facebook.com/mikay.gao

Updated on June 08, 2022

Comments

  • imikay
    imikay almost 2 years

    I have three entities, ChannelEntity -> MatchChannelEntity <- MatchEntity, the MatchChannelEntity saves the many to many relations between the other two tables, I want a form to list all the channels using checkboxes, and if a match has one the of channels, the checkbox of that channel is selected, how can I do this ?

    Here is the Form type code:

    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'); 
                                              },))
    

    The MatchChannel type:

    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;
    

    I will use an example to explain, say, I have three channels: channel A, channel B and channel C, and one match: match M, the match M has one channel A, this relation is saved in the match_channel table, I want a match form to show all the channels, and channel A is checked because it is owned by match M, others stay unchecked