2017-07-06 80 views
0

我有一個基類/實體,由2個不同的實體擴展,每個實體使用相同的數據庫表來存儲特定的數據。不帶鑑別器映射的學說單表繼承

/** 
* @ORM\Table(name="my_table") 
* @ORM\Entity() 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\HasLifecycleCallbacks() 
*/ 
abstract class Base { 

} 

/** 
* Subclass1 
* @ORM\Entity() 
*/ 
class Subclass1 extends Base { 

    /** 
    * @var propertyForSubClass1 
    */ 
    private $propertyForSubClass1; 
} 

/** 
* Subclass2 
* @ORM\Entity() 
*/ 
class Subclass2 extends Base { 

    /** 
    * @var propertyForSubClass2 
    */ 
    private $propertyForSubClass2; 
} 

SubClass1使用了一些共同的列,再加上具體到自身的列。 SubClass2做同樣的事情,它使用普通列加上SubClass1未使用的特定列。我得到這個關係問題,這是造成其顯示錯誤:

Column not found: 1054 Unknown column 't0.dtype' in 'field list' 

根據不同的地方,這涉及到一個缺乏鑑別地圖。但是,如何在沒有單個鑑別器列的情況下添加鑑別器映射。這是一個遺留改造,所以我可能會添加一個列,但我想知道是否有方法正確映射這些沒有一個。

回答

0

如果使用Doctrine Single Table Inheritance,則必須在Base類中添加鑑別器列。從documentation

的@InheritanceType和@DiscriminatorColumn 必須上是映射實體層次結構中最頂端的 類中指定。

你可以做的反而是定義Base類爲Mapped Superclass,使SubClass1SubClass2擴展它。但是,由於它們映射到數據庫中的同一個表,因此必須爲這些子類使用兩個不同的實體管理器。例如,如果你把SubClass1src/Entity/Dir1SubClass2src/Entity/Dir2,在config.yml

doctrine: 
    orm: 
    default_entity_manager: manager1 
     ... 
     entity_managers: 
     manager1: 
      mappings: 
      AppBundle: 
       dir: Entity/Dir1 
     manager2: 
      mappings: 
      AppBundle: 
       dir: Entity/Dir2 

這樣你就不必在數據庫中添加一列,但你必須在你的代碼來指定哪些到處你使用的經理。