Doctrine2 Ошибка дублированного имени ключа

0

Я пытаюсь использовать переход doctrine2 и обновление схемы с помощью консоли symfony2. Все мои сущности генерируются без проблем через:

php app/console doctrine:generate:entities myProject

Кроме того, я могу создать свою базу данных и построить свою схему с нуля без проблем, учитывая следующие команды:

php app/console doctrine:database:create
php app/console doctrine:schema:create

Всякий раз, когда я изменяю, удаляю или добавляю в другой объект, я всегда регенерирую свои сущности с помощью:

php app/console doctrine:generate:entities myProject

Однако проблема заключается в том, что когда я хочу обновить свою схему, я всегда получаю следующую ошибку:

  [Doctrine\DBAL\DBALException]                                                
  An exception occurred while executing 'CREATE INDEX IDX_F7129A80A76ED395 ON  
   user_user (user_id)':                                                       

  SQLSTATE[42000]: Syntax error or access violation: 1061 Duplicate key name   
  'IDX_F7129A80A76ED395'                                                       






  [PDOException]                                                               
  SQLSTATE[42000]: Syntax error or access violation: 1061 Duplicate key name   
  'IDX_F7129A80A76ED395' 

Я пробовал делать:

php app/console doctrine:schema:update --force

или

php app/console doctrine:migrations:diff
php app/console doctrine:migrations:migrate

Но я всегда получаю ту же ошибку. Что я делаю не так? Есть ли способ для меня обновить мою базу данных без необходимости уничтожать и строить каждый новый? У меня более 25 объектов, которые состоят из больших файлов со многими ассоциативными сопоставлениями (OneToOne, OneToMany, ManyToMany и т.д.), Которые, как представляется, вызывают проблемы. Любая помощь будет замечательной! Благодарю!

На стороне примечания у меня возникает ощущение, что эта часть кода может вызвать проблему:

/**
 * @ORM\ ManyToMany(targetEntity="User", inversedBy="myFriends")
 */
protected $friendsWithMe;

/**
 * @ORM\ ManyToMany(targetEntity="User", inversedBy="friendsWithMe")
 * @ORM\ JoinTable(name="friends",
 *      joinColumns={@ORM\ JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\ JoinColumn(name="friend_user_id", referencedColumnName="id")}
 *      )
 **/
protected $myFriends;

В моей пользовательской сущности я хотел создать привязку для многих отношений. Вот как я создаю список друзей. Может быть, что-то не так с моей логикой, но я взял это прямо из документации doctrine2 по ассоциативному сопоставлению.

  • 0
    убедитесь, что в пользовательской таблице нет дубликатов user_id. Если нет, вы можете попытаться удалить все индексы вручную и запустить php app/console doctrine:schema:update --force
  • 0
    user_id существует, но разве доктрина не должна знать, как обновить схему, если она была той, которая ее построила? Я надеюсь, что доктрина не заставит меня вручную связываться с базой данных, потому что это довольно страшная мысль. Мне кажется, что доктрина просто игнорирует мою аннотацию @JoinTable(name="friend&qu (name = "friend" ...). Она пытается создать таблицу с именем user_user с настройками по умолчанию, хотя я четко сказал ей использовать мои настройки.
Показать ещё 1 комментарий
Теги:
orm
doctrine2

1 ответ

1
Лучший ответ

Не уверен, что это причина исключения, но есть ошибка в вашем ORM-сопоставлении. $ myFriends - это собственная сторона, $ friendsWithMe - обратная сторона, поэтому атрибут inversedBy должен присутствовать только в $friendsWithMe.

Попробуйте переписать $myFriends с атрибутом mappedBy:

/**
 * @ORM\ ManyToMany(targetEntity="User", mappedBy="friendsWithMe")
 * @ORM\ JoinTable(name="friends",
 *      joinColumns={@ORM\ JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\ JoinColumn(name="friend_user_id", referencedColumnName="id")}
 *      )
 **/
protected $myFriends;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню