如何阻止 Doctrine2 迁移:Diff 始终添加数据库中已存在的外键关系?

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

我的应用程序工作正常,关系正常工作,并且数据库中的架构看起来正确。为什么学说仍然试图添加这些外键?

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

在我的“票证”实体中,我有:

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

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

这会在我的迁移或 schema:update 转储中生成以下内容,即使它已经在数据库中:

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

知道我在这里做错了什么吗?


答案 1

为什么学说仍然试图添加这些外键?

这里的正确术语是“外键约束”。如果没有约束,所讨论的列只是一列。它是强制该列的值作为主键存在于另一个表中的约束。

为什么学说仍然试图添加这些外键?

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

如果我必须猜测,你正在将MySQL与MyISAM引擎一起使用。MyISAM 不支持外键约束。不幸的是,教义不够“聪明”,无法看到这一点。它看到MySQL被使用,因此盲目地假设支持外键约束。

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

ALTER TABLE table_name ENGINE=InnoDB;

将表从 MyISAM 转换为 InnoDB


答案 2

推荐