php - Doctrine 不会生成跨数据库外键

标签 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;
}

重要的是,对这些实体进行水化处理完全没问题,但模式工具根本不会生成外键。

有没有人遇到过这个?还有一个SO post然而不幸的是没有答案。

最佳答案

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;
}

运行架构创建或更新现在将按预期创建外键。这可能会产生其他意想不到的副作用,但我还没有遇到任何副作用。

关于php - Doctrine 不会生成跨数据库外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30193861/

相关文章:

php - 重复正则表达式模式而不存储它

php - 如何扩展 laravel Illuminate\Translation\Translator 类

php - Laravel 查询生成器 - 如何求和?

php - 为联合学说 2 集合实现 setter/getter

php - Symfony2主义关系数据

php - 使 $.ajax 失败

php - 这三个选项中的哪一个可以最快填充我的数据库表?

mysql - InnoDB 还是 MyISAM?

mysql - Chart.js中如何实现mysql数据库连接

Symfony2 : Doctrine : PHPUnit : Set entity Id during flushing with mocked entity manager in unit tests