2015-05-12 74 views
1

我在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,但不幸的是它沒有得到答覆。

+2

主義似乎不支持它。看到前面的主題:http://stackoverflow.com/questions/28234273/doctrine-not-generating-cross-database-foreign-key-constraints-in-mysql – Cr3aHal0

+0

我設法解決它。見下文。 – Knifa

回答

4

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

運行模式創建或更新預期現在創建外鍵。這可能會有其他意想不到的副作用,但我還沒有遇到任何問題。

+1

你所有的數據庫都需要在同一個mysql服務器上。 Mysql不會跨多個數據庫服務器進行查詢。當然,你很難將數據庫名稱編碼到你的實體映射中。但是,如果這些限制都不影響你的應用程序,那麼它應該工作得很好。 – Cerad

+0

是的,這是我的情況---多個數據庫,但在同一臺服務器上。硬編碼數據庫名稱到映射是非常嚴重的,我同意。實際上我只是想把所有的東西都轉移到一個數據庫中,但是這可以作爲一個快速解決方案! – Knifa

+0

在對你所說的幾行註釋之後,更新工具給了我_「在模式」_中沒有名稱爲'db1.Contact'的表。我必須爲它評論[整個功能內容](http://www.doctrine-project.org/api/dbal/2.1/source-class-Doctrine.DBAL.Schema.Visitor.RemoveNamespacedAssets.html#90)上班。我希望它不會破壞任何東西...... – marcv