Автоматизированная миграция Doctrine не распознает ограничения внешнего ключа
При создании миграции с помощью команды doctrine:migrations:diff
Я получаю миграцию, которая не может быть выполнена впоследствии.
У меня есть следующий сценарий:
Я получил 2 энтузиаста (parent
а также child
) с many to many
отношения друг с другом. Таким образом, доктрина создала таблицу сопоставления для него parents_childs
, В настоящее время эти 2 entiteis имеют id
как целое число, теперь я хочу изменить тип на bigint
,
Когда я создаю миграцию, я получаю что-то вроде этого:
$this->addSql('ALTER TABLE child CHANGE id id BIGINT UNSIGNED NOT NULL');
$this->addSql('ALTER TABLE parent CHANGE id id BIGINT UNSIGNED NOT NULL');
$this->addSql('ALTER TABLE parents_childs CHANGE parent_id parent_id BIGINT UNSIGNED NOT NULL, CHANGE child_id child_id BIGINT UNSIGNED NOT NULL');
О выполнении миграций:
SQLSTATE [HY000]: общая ошибка: 1025 Ошибка при переименовании "./symfony_dev/#sql-379_34" в "./symfony_dev/oauth_client" (номер ошибки: 150)
SHOW ENGINE INNODB STATUS ;
дает мне следующее сообщение об ошибках ограничения:
------------------------ ПОСЛЕДНЯЯ ОШИБКА ИНОСТРАННЫХ КЛЮЧЕЙ ----------------------- 150218 14:28:19 Ошибка в ограничении внешнего ключа таблицы my_db/parent_childs: в ссылочной таблице нет индекса, который бы содержал столбцы в качестве первых столбцов, или типы данных в ссылочной таблице не совпадают с типами данных в указанной таблице. Таблица. Ограничение:, CONSTRAINT "FK_98FFA0B4D395B25E" FOREIGN KEY ("parent_id") ССЫЛКИ "parent" ("id") Индекс внешнего ключа в таблице - "PRIMARY" См. http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html для правильного определения внешнего ключа.
Определение родительского объекта:
AcmeBundle\Entity\Parent:
type: entity
table: parent
id:
id:
type: bigint
unique: true
nullable: false
generator:
strategy: CUSTOM
customIdGenerator:
class: 'MyCustomIdGenerator'
options:
unsigned: true
fields: ...
manyToMany:
parents:
targetEntity: AcmeBundle\Entity\Childs
joinTable:
name: parents_childs
joinColumns:
parent_id:
referencedColumnName: id
inverseJoinColumns:
child_id:
referencedColumnName: id
unique: true
cascade: [remove, persist]
orphanRemoval: true
inversedBy: parents
Определение дочернего объекта:
AcmeBundle\Entity\Child:
type: entity
table: child
id:
id:
type: bigint
unique: true
nullable: false
generator:
strategy: CUSTOM
customIdGenerator:
class: 'MyCustomIdGenerator'
options:
unsigned: true
fields: ...
manyToMany:
parents:
targetEntity: AcmeBundle\Entity\Parent
mappedBy: parents
Сбрасывание внешних ключей, выполнение обновлений и добавление их снова будет работать, хотя на самом деле я не хочу делать это вручную, потому что это также влияет на гораздо большее количество таблиц.
Так что я теперь не уверен, что Doctrine просто не в состоянии правильно определить внешние ключи или я что-то не так делаю?