php - сделать - создание миграции yii2



Как остановить Doctrine2 Migrations: Diff от всегда добавляя отношения внешнего ключа, которые уже существуют в базе данных? (1)

Я использую 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 нет инверсии.

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

$this->addSql("ALTER TABLE tickets ADD CONSTRAINT FK_54469DF4BB0D9452 FOREIGN KEY (scoring_user_id) REFERENCES users (id)");

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


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

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

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

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

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

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

ALTER TABLE table_name ENGINE=InnoDB;

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