Kni*_*ifa 5 php mysql doctrine-orm
我在Doctrine中设置了一些模型,其中一些模型位于不同的数据库中.Doctrine的模式生成工具似乎是生成数据库间外键,而不是跨数据库外键.
例如:
/**
* @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;
}
Run Code Online (Sandbox Code Playgroud)
重要的是,保湿这些实体的工作完全正常,但架构工具根本不会生成外键.
有没有人遇到过这个?还有另一个SO帖子,但不幸的是没有答案.
Doctrine不支持跨数据库外键,但可以对其进行修改.图书馆似乎采取了"不是每个人都可以支持它,所以没有人应该"接近.这个实例适用于MySQL.
生成模式时,使用RemoveNamespacedAssets访问者运行预步骤.这将删除对您生成的内容之外的任何类的所有引用.
在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;
}
Run Code Online (Sandbox Code Playgroud)
现在,运行模式创建或更新将按预期创建外键.这可能会产生其他意想不到的副作用,但我还没有遇到任何副作用.