我正在使用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)");
知道我在这里做错了吗?
答案 0 :(得分:11)
为什么教条还在尝试添加这些外键?
这里正确的术语是“外键约束”。没有约束,有问题的列只是一列。这是约束,强制该列的值作为另一个表中的主键存在。
为什么教条还在尝试添加这些外键?
因为数据库供应商/引擎不支持外键约束,但是Doctrine无法识别它。
如果我不得不猜测,你正在使用MySQL和MyISAM引擎。 MyISAM不支持外键约束。不幸的是,Doctrine并不够“聪明”。它看到使用了MySQL,因此盲目地假设支持外键约束。
我的建议是切换到InnoDB引擎,除非你有充分的理由使用MyISAM。
ALTER TABLE table_name ENGINE=InnoDB;