Как остановить Doctrine2 Migrations: Diff от всегда добавляя отношения внешнего ключа, которые уже существуют в базе данных?
Я использую doctrine2 с проектом symfony2.1. У меня есть сущность, у которой есть несколько отношений к другим таблицам. Внешние ключевые отношения для этих много-к-одному уже обновлены в базе данных, но каждый раз, когда я запускаю миграции: diff или schema: update -dump-sql, он добавляет те же команды обновления, чтобы снова добавить отношения внешнего ключа. Когда я запускаю схему: проверяю, что мое сопоставление не синхронизируется с моей базой данных.
Мое приложение работает нормально, отношения работают правильно, а схема в моей базе данных выглядит правильно. Почему доктрина все еще пытается добавить эти внешние ключи?
Здесь мой код (для одного из проблемных параметров):
В моем сущности "Ticket" у меня есть:
/**
* Authenticated User who scored the ticket.
*
* @ORM\ManyToOne(targetEntity="CS\SecurityBundle\Entity\User")
* @ORM\JoinColumn(name="scoring_user_id", referencedColumnName="id")
*/
protected $scoringUser;
В настоящее время я настроен как однонаправленный, поэтому в объекте User нет инверсииBy.
В моих миграциях или схеме генерируется следующее: обновить дамп, даже если он уже находится в базе данных:
$this->addSql("ALTER TABLE tickets ADD CONSTRAINT FK_54469DF4BB0D9452 FOREIGN KEY (scoring_user_id) REFERENCES users (id)");
Любая идея, что я делаю неправильно здесь?
Ответы
Ответ 1
Почему доктрина все еще пытается добавить эти внешние ключи?
Правильный термин здесь - "ограничение внешнего ключа". Без ограничения этот столбец является только столбцом. Это ограничение, которое устанавливает, что значение этого столбца существует как первичный ключ в другой таблице.
Почему доктрина все еще пытается добавить эти внешние ключи?
Поскольку поставщик/движок базы данных не поддерживает ограничения внешнего ключа, но Doctrine не распознает это.
Если я должен угадать, вы используете MySQL с движком MyISAM. MyISAM не поддерживает ограничения внешнего ключа. К сожалению, Doctrine недостаточно "умна", чтобы это увидеть. Он видит, что MySQL используется, поэтому слепо предполагает, что ограничения внешнего ключа поддерживаются.
Могу посоветовать переключиться на движок InnoDB, если у вас нет веских причин для использования MyISAM.
ALTER TABLE table_name ENGINE=InnoDB;
Преобразование таблиц из MyISAM в InnoDB