我遇到了我的映射問題。我無法讓它工作。我有這樣的抽象基類:當一個子類沒有額外屬性時,Doctrine表繼承類繼承
/**
* @Entity
* @Table(name="actions")
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="type", type="string")
* @DiscriminatorMap({"FOO" = "FooAction", "BAR" = "BarAction", ...})
*/
abstract class AbstractAction
{
...
}
我有一堆不同的行動,所有不同的領域。 E.g:
/**
* @Entity
* @Table(name="actions_foo")
*/
class FooAction extends AbstractAction
{
...
}
但是我的動作(BarAction
)不需要除了由AbstractAction
供應的任何額外的領域之一。但是,我怎麼能映射它?我嘗試省略@Table
,或者使用與AbstractAction
相同的@Table
,但不起作用。
/**
* @Entity
* @Table(name="actions")
*/
class BarAction extends AbstractAction
{
...
}
省略@Table
給了我一個PDOException
有關缺失表BarAction
。使用基類的@Table
給我:
PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
所以,我怎麼映射呢?
編輯:到目前爲止,我已經嘗試了兩件事。
我試圖從BarAction
中刪除@Entity
以及@Table
,希望這樣它不再需要數據庫表。這是行不通的。相反,我得到這個錯誤:
Doctrine\ORM\Mapping\MappingException: Class BarAction is not a valid entity or mapped super class.
接下來我想在我的數據庫只是一個單一的外鍵列id
創建actions_bar
表。然後我將BarAction
映射到它。這是有效的(耶!),但它感到骯髒和醜陋,有一個額外的SQL表,我根本不需要。
所以,還是找一個更好的辦法...
借鑑了我在D2和這[文檔]方面的2年經驗(http://www.doctrine-project.org/docs/orm/2.0/en/reference/inheritance-mapping.html#class-table-inheritance ),只能使用一種類型的繼承。您可以選擇已連接的表繼承,併爲每個實體都有一個單獨的表,或者選擇一個表繼承,並將所有實體都放在一個表中。 (對於尚未有評論代表的WizardZ添加評論) – Oded
基於我在D2和文檔方面的2年經驗:http://www.doctrine-project.org/docs/orm/2.0/en/reference/ inheritance-mapping.html#class-table-inheritance你只能使用一種類型的繼承。您可以選擇已連接的表繼承,併爲每個實體都有一個單獨的表,或者選擇一個表繼承,並將所有實體都放在一個表中。 – WizardZ
@Sander:你的BarAction真的應該是'AbstractAction'的一個子類嗎?我不知道在你的域模型中是否有'BarAction'作爲層次結構的根,但是從實現的角度來看,這可以解決你的問題,因爲'BarAction'只會使用來自基地臺! – Benjamin