Search code examples
symfonydoctrinemany-to-many

Why does doctrine migration try to create 2 tables on a ManyToMany relationship


I have declared a ManyToMany relation between 2 entities, and when I use doctrine:migrations:diff, it tries to create the table twice and throws an exception "The table with name 'incompass.surgerysurgeryside' already exists"

This is the annotation that I have used:

Surgery.php

/**
 * @ORM\ManyToMany(targetEntity="Incompass\SurgeryBundle\Entity\SurgerySide", inversedBy="surgeries")
 * @ORM\JoinTable(name="SurgerySurgerySide",
 *      joinColumns={@ORM\JoinColumn(name="surgery_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="surgery_side_id", referencedColumnName="id")}
 * )
 */
protected $surgery_sides;

SurgerySide.php

/**
 * @ORM\ManyToMany(targetEntity="Incompass\SurgeryBundle\Entity\Surgery", inversedBy="surgery_sides")
 * @ORM\JoinTable(name="SurgerySurgerySide",
 *      joinColumns={@ORM\JoinColumn(name="surgery_side_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="surgery_id", referencedColumnName="id")}
 * )
 */
protected $surgeries;

(NB The answers here don't answer the actual question Doctrine many-to-many relationship wants to create a table twice when I create a migration)


Solution

  • Try removing inversedBy or use once inversedBy and once mappedBy.

    /**
     * @ORM\ManyToMany(targetEntity="Incompass\SurgeryBundle\Entity\SurgerySide", inversedBy="surgeries")
     */
     protected $surgery_sides;
    
    
    /**
     * @ORM\ManyToMany(targetEntity="Incompass\SurgeryBundle\Entity\Surgery", mappedBy="surgery_sides")
     */
    protected $surgeries;
    

    Explanation

    Doctrine guesses how to name table, usually with priority <firstEntity>_<secondEntity>. Since both are inversedBy, Doctrine doesn't know, which to use the second, thus creates two tables.