Php 教条没有';t生成跨数据库外键
我在条令中设置了一系列模型,其中一些模型位于不同的数据库中Doctrine的模式生成工具似乎正在生成数据库间外键,但不会生成跨数据库外键。 例如:Php 教条没有';t生成跨数据库外键,php,mysql,doctrine-orm,Php,Mysql,Doctrine Orm,我在条令中设置了一系列模型,其中一些模型位于不同的数据库中Doctrine的模式生成工具似乎正在生成数据库间外键,但不会生成跨数据库外键。 例如: /** * @ORM\Entity * @ORM\Table(name="db1.Contact") **/ class Contact { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue **/
/**
* @ORM\Entity
* @ORM\Table(name="db1.Contact")
**/
class Contact {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
**/
private $id;
}
/**
* @ORM\Entity
* @ORM\Table(name="db2.Subscription")
**/
class Subscription {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
**/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Contact")
* @ORM\JoinColumn(name="contact_id", referencedColumnName="id")
*/
private $contact;
}
关键的是,将这些实体水合完全可以,但是模式工具根本不生成外键
以前有人碰到过这个吗?但不幸的是,还有另一个问题没有得到回答。原则不支持跨数据库外键,但是可以修改它来实现这一点。图书馆似乎采取了“不是每个人都能支持它,所以没有人应该支持”的方法。此实例适用于MySQL 生成架构时,使用
RemoveNamespacedAssets
visitor运行预步骤。这将删除对您正在生成的类之外的任何类的所有引用
在该类的acceptForeignKey
函数中,注释以下代码:
// The table may already be deleted in a previous
// RemoveNamespacedAssets#acceptTable call. Removing Foreign keys that
// point to nowhere.
if ( ! $this->schema->hasTable($fkConstraint->getForeignTableName())) {
$localTable->removeForeignKey($fkConstraint->getName());
return;
}
运行架构创建或更新将按预期创建外键。这可能会有其他意想不到的副作用,但我还没有遇到任何副作用。理论似乎不支持它。参见上一个主题:我设法解决了它。请参阅下文。您的所有数据库都需要位于同一台mysql服务器上。Mysql不会跨多个数据库服务器进行查询。当然,您正在将数据库名称硬编码到实体映射中。但是如果这些限制都不影响应用程序,那么它应该可以正常工作。是的,这就是我的情况——多个数据库但在同一台服务器上。我同意,将数据库名称硬编码到映射中是非常糟糕的。实际上我只是想把所有的东西移到一个数据库中,但这是一个快速修复!在对您所说的行进行注释之后,更新工具会告诉我“模式中没有名为“db1.Contact”的表”。为了让它发挥作用,我不得不发表评论。我希望它不会损坏任何东西。。。