如何停止Doctrine2 Migrations:Diff总是添加数据库中已存在的外键关系?

时间:2013-03-30 18:05:06

标签: php mysql symfony doctrine-orm doctrine-migrations

我正在使用doctrine2和symfony2.1项目。我有一个与其他表有多对多关系的实体。这些多对一的外键关系已在数据库中更新,但每次运行迁移时:diff或schema:update --dump-sql都会添加相同的更新命令以再次添加外键关系。当我运行schema时:验证它说我的映射与我的数据库不同步。

我的应用程序运行正常,关系正常工作,数据库中的架构看起来正确。为什么教条还在尝试添加这些外键?

这是我的代码(针对其中一个有问题的参数):

在我的“Ticket”实体中,我有:

/**
 * Authenticated User who scored the ticket. 
 *
 * @ORM\ManyToOne(targetEntity="CS\SecurityBundle\Entity\User")
 * @ORM\JoinColumn(name="scoring_user_id", referencedColumnName="id")
 */
protected $scoringUser;

我目前将其设置为单向,因此用户实体中没有反转。

这会在我的迁移或架构中生成以下内容:即使它已在数据库中,也会更新转储:

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

知道我在这里做错了吗?

1 个答案:

答案 0 :(得分:11)

  

为什么教条还在尝试添加这些外键?

这里正确的术语是“外键约束”。没有约束,有问题的列只是一列。这是约束,强制该列的值作为另一个表中的主键存在。

  

为什么教条还在尝试添加这些外键?

因为数据库供应商/引擎不支持外键约束,但是Doctrine无法识别它。

如果我不得不猜测,你正在使用MySQL和MyISAM引擎。 MyISAM不支持外键约束。不幸的是,Doctrine并不够“聪明”。它看到使用了MySQL,因此盲目地假设支持外键约束。

我的建议是切换到InnoDB引擎,除非你有充分的理由使用MyISAM。

ALTER TABLE table_name ENGINE=InnoDB;

Converting Tables from MyISAM to InnoDB