Подтвердить что ты не робот

Как остановить 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)");

Любая идея, что я делаю неправильно здесь?

4b9b3361

Ответ 1

Почему доктрина все еще пытается добавить эти внешние ключи?

Правильный термин здесь - "ограничение внешнего ключа". Без ограничения этот столбец является только столбцом. Это ограничение, которое устанавливает, что значение этого столбца существует как первичный ключ в другой таблице.

Почему доктрина все еще пытается добавить эти внешние ключи?

Поскольку поставщик/движок базы данных не поддерживает ограничения внешнего ключа, но Doctrine не распознает это.

Если я должен угадать, вы используете MySQL с движком MyISAM. MyISAM не поддерживает ограничения внешнего ключа. К сожалению, Doctrine недостаточно "умна", чтобы это увидеть. Он видит, что MySQL используется, поэтому слепо предполагает, что ограничения внешнего ключа поддерживаются.

Могу посоветовать переключиться на движок InnoDB, если у вас нет веских причин для использования MyISAM.

ALTER TABLE table_name ENGINE=InnoDB;

Преобразование таблиц из MyISAM в InnoDB