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

时间:2015-01-30 10:51:58

标签: php mysql doctrine-orm

我有两个表,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支持跨数据库外键吗?我查看了注释文档并查看了创建工具是否有任何选项,但我看不到任何方法可以启用此功能。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

例如

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

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

答案 2 :(得分:0)

Doctrine不支持跨DB FK:

  

在Doctrine中,跨数据库加入数据不是技术上的   由设计功能“支持”,但您可以使其工作   一点点欺骗学说。

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