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

Posted

技术标签:

【中文标题】如何阻止 Doctrine2 Migrations:Diff 总是添加数据库中已经存在的外键关系?【英文标题】:How to stop Doctrine2 Migrations:Diff from always adding foreign key relationships that already exist in Database? 【发布时间】:2013-03-21 05:52:19 【问题描述】:

我在 symfony2.1 项目中使用了学说 2。我有一个与其他表有几个多对一关系的实体。这些多对一的外键关系已经在数据库中更新,但是每次我运行 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;

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

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

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

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

【问题讨论】:

1) 确保数据库具有该约束,2) 尝试升级学说 谢谢梅泽。我认为问题在于我的数据库没有使用 INNODB,因此无法设置约束。 (如果我理解正确的话)。关于如何使教义不尝试设置约束的任何想法?这似乎是一个类似的问题:***.com/questions/12156775/… 你试过@Table(name="table_name",options="engine"="MyISAM")或者你使用的任何引擎吗? 你为什么不使用 InnoDB? 【参考方案1】:

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

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

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

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

如果我不得不猜测,您正在使用带有 MyISAM 引擎的 mysql。 MyISAM 不支持外键约束。不幸的是,Doctrine 不够“聪明”,无法看到这一点。看到用的是MySQL,就盲目假设支持外键约束。

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

ALTER TABLE table_name ENGINE=InnoDB;

Converting Tables from MyISAM to InnoDB

【讨论】:

这就是正在发生的事情,是的,在了解了 MyISAM 的优势之后,我最终切换到了 InnoDB。 很抱歉发表评论,但点赞还不够。你的回答救了我的命! 谢谢 @cjewby InnoDB 确实比 MyISAM 有很多优势,但是在某些情况下 MyISAM 是可取的(因此在我的回答中“除非你有充分的理由”)。

以上是关于如何阻止 Doctrine2 Migrations:Diff 总是添加数据库中已经存在的外键关系?的主要内容,如果未能解决你的问题,请参考以下文章

由 Doctrine2 (Symfony2) 生成的约束中的奇怪随机名称

symfony 常用命令

Doctrine2 - (如何)使用 main 获取关联对象

Zend+Doctrine2:如何使用 ArrayCollections() 正确刷新实体?

如何更改 Doctrine2 CTI 继承中的实体类型

如何在 symfony 中更新新版本的 Doctrine2 和 ORM?