Doctrine 在 MySQL 中不生成跨数据库外键约束

Doctrine not generating cross-database foreign key constraints in MySQL

我有两个表,db1.Contact 和 db2.Recipient。每个收件人都应该是一个联系人,所以我在 db1.Contact.ContactID 字段的两个表之间设置了一个外键。

我在 Recipient.php 中用以下注释表示:

/**
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="\db1\Contact")
 * @ORM\JoinColumn(name="ContactID", referencedColumnName="ContactID")
 **/
private $Contact;

为此,我不需要 Contact.php 中的任何代码。

当我生成数据库时(使用 doctrine orm:schema-tool:create --dump-sql)我可以看到创建了 Recipient.ContactID 字段并为其提供了索引。但是,不会生成和执行任何查询来创建外键约束。所以要明确一点,我没有收到任何错误,但从未生成约束。

我该如何解决这个问题? doctrine 肯定支持跨库外键?我查看了注释文档并查看是否有创建工具的任何选项,但我看不到任何打开此功能的方法。

您的 ManyToOne 关联似乎有误。如果你的代码库是命名空间的,你应该使用实体的 FQCN(或者如果双方的实体位于同一目录中,则只使用类名), 而不是 table 名称

例如

/**
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="YourNamespace\Entities\Contact")
 * @ORM\JoinColumn(name="ContactID", referencedColumnName="ContactID")
 **/
private $contact;

您可能想阅读有关关联映射的更多信息here

Doctrine 不支持跨数据库 FK:

In Doctrine, joining data across databases is not technically “supported” by a designed feature, but you can make it work by tricking Doctrine a little bit.

来源:http://www.doctrine-project.org/2009/06/19/cross-database-joins.html

我找到了我解释的解决方法 。本质上,Doctrine 默认剥离跨数据库外键,因为不是所有的数据库系统都支持它,但是你可以通过在 Doctrine 库中注释掉一些代码来禁用它。