Прежде чем я опишу свою проблему, возможно, это станет более ясным, если я начну с ошибки, которую я получаю:
$ ./app/console doc:mig:diff
[Doctrine\DBAL\Schema\SchemaException]
The table with name 'user_media_area' already exists.
Это абсолютно верно - user_media_area
существует. Я создал его в предыдущей миграции, и я не понимаю, почему Symfony пытается снова создать таблицу.
Моя проблема имеет какое-то отношение к отношениям "многие ко многим". У меня есть таблица под названием user
, таблица под названием media_area
и таблица под названием user_media_area
.
Здесь код, где я рассказываю user
о media_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;
И здесь, где я рассказываю media_area
о user
(Entity/MediaArea.php
):
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="users")
*/
private $users;
Интересно, что если я удалю этот JoinTable
материал из Entity/User.php
, ./app/console doctrine:migrations:diff
снова будет работать:
/**
* @ORM\ManyToMany(targetEntity="MediaArea", inversedBy="mediaAreas")
*/
private $mediaAreas;
Однако это немного не так: теперь он хочет создать новую таблицу под названием mediaarea
, которую я не хочу. Моя таблица уже существует и называется media_area
.
Таким образом, это похоже на любой способ, Symfony пытается создать таблицу на основе этой ManyToMany
вещи в моем классе user
, и единственная причина, по которой проблема уходит, когда я удаляю JoinTable
, - это то, что имя таблицы, которую он хочет создать (mediaarea
) больше не совпадает с фактическим именем моей таблицы (media_area
).
Итак, мой вопрос: Почему он вообще хочет создать новую таблицу? Что я делаю неправильно?
(Я знаю, что мои соглашения об именах отключены. Примеры базы данных Symfony и Doctrine разочаровывают многопользовательскими именами столбцов, поэтому я не всегда знаю, должен ли я делать media_area
или mediaarea
.)