2016-11-25 59 views
0

我這種情況Doctrine2類表繼承實體ID

<entity name="Company\Entity\User\User" table="usr_user" inheritance-type="JOINED"> 
    <unique-constraints> 
     <unique-constraint name="username_UNIQUE" columns="username" /> 
    </unique-constraints> 
    <discriminator-column name="discriminator" /> 
    <discriminator-map> 
     <discriminator-mapping value="guest" class="\Company\Entity\User\Guest"></discriminator-mapping> 
     <discriminator-mapping value="user" class="\Company\Entity\User\User"></discriminator-mapping> 
    </discriminator-map> 
    <id name="id" type="integer" column="id"> 
     <generator strategy="AUTO" /> 
    </id> 
    <field name="username" type="string" column="username" length="255" /> 
    <field name="password" type="string" column="password" length="50" /> 
</entity> 

<entity name="Company\Entity\User\Guest" table="usr_guest"> 
    <id name="id" type="integer" column="id"> 
     <generator strategy="AUTO" /> 
    </id> 
    <field name="additionalField1" type="string" column="additional_field_1" length="255" /> 
    <field name="additionalField1" type="string" column="additional_field_2" length="255" /> 
</entity> 

當我產生的實體我添加的繼承

class User { 
// Some code... 
} 

class Guest extends User{ 
// Some code... 
} 

出現問題WHE我嘗試更新的,因爲同樣的數據庫模式「 id「兩個實體的列名稱。我tryied添加屬性覆蓋,但我想這是不正確的方法

<entity name="Company\Entity\User\Guest" table="usr_guest"> 

    <id name="id" type="integer" column="id"> 
     <generator strategy="AUTO" /> 
    </id> 
    <field name="additionalField1" type="string" column="additional_field_1" length="255" /> 
    <field name="additionalField1" type="string" column="additional_field_2" length="255" /> 
    <attribute-override name="id"> 
       <field column="guest_id" /> 
      </attribute-override> 
</entity> 

我tryied也guest_id更改的屬性名稱(而不是列名),但錯誤是一樣的

[Doctrine\ORM\Mapping\MappingException] 
    Duplicate definition of column 'id' on entity 'Company\Entity\User\Guest' in a field or discriminator column mapping. 

我是否必須更改Guest「id」列名稱? 我在哪裏錯了?

謝謝

+1

我認爲你可以從實體來賓刪除ID!看看http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html爲什麼你選擇XML進行映射?奇怪的選擇?!? –

+0

@MathieuDormeval我已經從xml中刪除了你的建議。 Doctrine在數據庫模式中生成了一個id字段。我擔心所有通過guest.id保留對訪客實體(表)的引用的實體。由於ORM生成的guest.id字段,似乎所有這些實體都沒有問題。我想(希望)這是正確的方法。 –

+0

好吧,讓你的測試,我有你的其他問題,告訴我們! –

回答

0

爲了使這個問題的現狀,回答來自this

<entity name="Company\Entity\User\Guest" table="usr_guest"> 
    <field name="additionalField1" type="string" column="additional_field_1" length="255" /> 
    <field name="additionalField1" type="string" column="additional_field_2" length="255" /> 
    <attribute-override name="id"> 
     <field column="guest_id" /> 
    </attribute-override> 
</entity> 

<entity name="Company\Entity\User\User" table="usr_user" inheritance-type="JOINED"> 
    <id name="id" type="integer" column="id"> 
     <generator strategy="AUTO" /> 
    </id> 
    <unique-constraints> 
     <unique-constraint name="username_UNIQUE" columns="username" /> 
    </unique-constraints> 
    <discriminator-column name="discriminator" /> 
    <discriminator-map> 
     <discriminator-mapping value="guest" class="\Company\Entity\User\Guest"></discriminator-mapping> 
     <discriminator-mapping value="user" class="\Company\Entity\User\User"></discriminator-mapping> 
    </discriminator-map> 
    <field name="username" type="string" column="username" length="255" /> 
    <field name="password" type="string" column="password" length="50" /> 
</entity> 

您必須刪除繼承表的主鍵,因爲它已經在母親的表聲明。