Destruir o relacionamento muitos para muitos deseja criar uma tabela duas vezes quando eu criar uma migração
Antes de descrever meu problema, ele pode ficar mais claro se eu começar com o erro que estou recebendo:
$ ./app/console doc:mig:diff
[Doctrine\DBAL\Schema\SchemaException]
The table with name 'user_media_area' already exists.
Isso é absolutamente verdade -user_media_area
existe. Criei-o em uma migração anterior e não entendo por que o Symfony está tentando criar a tabela novament
Meu problema tem algo a ver com um relacionamento de muitos para muitos. Eu tenho uma tabela chamadauser
, uma tabela chamadamedia_area
e uma tabela chamadauser_media_area
.
Aqui está o código em que eu digouser
sobremedia_area
(Entity/User.php
):
/**
* @ORM\ManyToMany(targetEntity="MediaArea", inversedBy="mediaAreas")
* @JoinTable(name="user_media_area",
* joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="media_area_id", referencedColumnName="id")}
* )
*/
private $mediaAreas;
E aqui é onde eu digomedia_area
sobreuser
(Entity/MediaArea.php
):
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="users")
*/
private $users;
O interessante é que, se eu remover esseJoinTable
coisas deEntity/User.php
, ./app/console doctrine:migrations:diff
funcionará novamente:
/**
* @ORM\ManyToMany(targetEntity="MediaArea", inversedBy="mediaAreas")
*/
private $mediaAreas;
No entanto, está um pouco fora: agora ele quer criar uma nova tabela chamadamediaarea
, o que eu não quero. Minha tabela já existe e se chamamedia_area
.
Parece que de qualquer maneira, o Symfony está tentando criar uma tabela com base nesManyToMany
coisa no meuUser
, e a única razão pela qual o problema desaparece quando removo oJoinTable
é o nome da tabela que deseja criar mediaarea
) não corresponde mais ao nome real da minha tabela media_area
).
Então minha pergunta é:Por que ele deseja criar uma nova tabela? O que estou fazendo de errado
(Eu sei que é possível que minhas convenções de nomenclatura estejam desativadas. Os exemplos de banco de dados do Symfony e Doctrine são frustrantemente desprovidos de nomes de colunas com vários termos, então nem sempre sei se devo fazermedia_area
oumediaArea
.)