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

cje*_*wby 24 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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

知道我在这里做错了吗?

Jas*_*wer 12

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

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

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

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

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

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

ALTER TABLE table_name ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

将表从MyISAM转换为InnoDB

  • 这就是正在发生的事情,是的,在了解了更多关于 MyISAM 的好处之后,我最终转向了 InnoDB。 (2认同)