許多人在SO和網絡周圍就ZF2與Doctrine 2以及使用鑑別器問的問題是:您如何不在父實體上聲明所有子實體?特別是當你有多個模塊?ZF2 + Doctrine 2 - 具有類表繼承的子級別鑑別器
簡短的回答是:不要申報discriminatorMap
。教義會爲你處理。
較長的答案在下面。
許多人在SO和網絡周圍就ZF2與Doctrine 2以及使用鑑別器問的問題是:您如何不在父實體上聲明所有子實體?特別是當你有多個模塊?ZF2 + Doctrine 2 - 具有類表繼承的子級別鑑別器
簡短的回答是:不要申報discriminatorMap
。教義會爲你處理。
較長的答案在下面。
關於如何能夠聲明您的孩子實體,在子實體上,而不是父母,is this one的熱門文章。
然而,Doctrine 2自寫入以來有所改變,例如, AnnotationWriter
不再存在。
然而,這是一個更簡單的方法,正如我在問題中提到的:什麼也不做。
現在使用使用「Class Table Inheritance」方法(與「單表繼承」相反)的鑑別器是不要聲明鑑別器圖! (不知道這是否也適用於STI ......)
我發現一張舊票on Github解釋了同樣的問題,這個答案以及許多人仍然有這個問題,那對父母宣佈是沒有意義的。仔細閱讀後,我會仔細閱讀代碼並重新閱讀文檔。
另外,如果您在閱讀文檔時要小心,它說這是可能的,不要說它。
報價:
注意事項:
的@InheritanceType,@DiscriminatorColumn和@DiscriminatorMap必須最上面的類,它是映射實體層次結構的一部分來指定。
@DiscriminatorMap指定鑑別器列的哪些值將行標識爲哪個類型。在上面的情況下,「person」的值將行標識爲Person類型,「employee」將行標識爲Employee類型。
如果這些類包含在與應用鑑別器映射的實體類相同的名稱空間中,則鑑別器映射中的類名不需要完全限定。
如果未提供鑑別圖,則自動生成該圖。自動生成的鑑別器映射包含每個類的小寫短名稱作爲關鍵字。
當然,上述片文檔不明確說明的地圖將會產生如果提供無。雖然它與矛盾第一的事情,這就是@DiscriminatorMap
必須提供在層次結構的最上面的類。因此,如果你要將你的課程擴展到幾個模塊(因爲我假設你是這樣讀的),不要聲明一個鑑別器映射!
我將離開你下面一個例子:
<?php
namespace My\Namespace\Entity;
/**
* @Entity
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="discr", type="string")
* // NOTE: No @DiscriminatorMap!!!
*/
class Person
{
// ...
}
<?php
namespace My\Other\Namespace\Entity;
/** @Entity */
class Employee extends \My\Namespace\Entity\Person
{
// ...
}
當您使用CLI學說命令來檢查你的實體,你會發現這是正確的。
此外,檢查它通過使用實體檢查命令完全工作:
./vendor/bin/doctrine-module orm:mapping:describe 「\My\Namespace\Entity\Person」
接近該命令的響應的頂部將是這一行:
| Discriminator map | {「person」:」My\\Namespace\\Entity\\Person」,」employee」:」My\\Other\\Namespace\\Entity\\Employee」}