2015-04-23 3 views
1

Я пытаюсь выяснить, как правильно отобразить мои объекты, так что я могу сделать Doctrine 2 класса Таблица наследования (Doc here)Doctrine 2 класс отображение Heritance

Так что я попробовал много различных решений, но я не могу для проверки моей модели с помощью инструмента командной строки (doctrine: schema: validate)

Итак, вот что я попробовал. Я не изменяю родительский класс, поэтому я оставлю его здесь.

Api\TestBundle\Entity\Item: 
type: entity 
table: items 
inheritanceType: JOINED 
discriminatorColumn: 
    name: type 
    type: string 
    nullable: false 
    length: 32 
    fixed: false 
    comment: '' 
discriminatorMap: 
    item_property_facebook: ItemPropertyFacebook 
id: 
    id: 
     type: integer 
     nullable: false 
     unsigned: false 
     comment: '' 
     id: true 
     generator: 
      strategy: AUTO 
fields: 
    bundledType: 
     type: string 
     nullable: false 
     length: 32 
     fixed: false 
     comment: '' 
     column: bundled_type 
lifecycleCallbacks: { } 

И дочернего класса, я поставил другой идентификатор в первом:

Api\TestBundle\Entity\ItemPropertyFacebook: 
type: entity 
table: item_property_facebook 
id: 
    id: 
     type: integer 
     nullable: false 
     unsigned: false 
     comment: '' 
     id: true 
     generator: 
      strategy: AUTO 
fields: 
    account_id: 
     type: integer 
lifecycleCallbacks: { } 

Очевидно, что я получаю:

Duplicate definition of column 'id' on entity 'Api\TestBundle\Entity 
\ItemPropertyFacebook' in a field or discriminator column mapping. 

Так что я пытаюсь удалить идентификатор определение у ребенка, и я получаю:

No identifier/primary key specified for Entity "Api\TestBundle\Entit 
y\ReferenceItemPropertyFacebook". Every Entity must have an identifier/prim 
ary key. 

Поэтому я совершенно не понимаю. В докторе они просто устанавливают основные вещи, но не идентификатор, и я не могу найти что-либо в сети, потому что я, вероятно, не сформулировал его хорошо. Я читал о associationKey, но когда я попробовал это, Doctrine сказать мне то же

No identifier/primary key specified for Entity "Api\TestBundle\Entit 
y\ReferenceItemPropertyFacebook". Every Entity must have an identifier/prim 
ary key. 

Так что если у вас есть какие-либо подсказки, я был бы признателен. Большое спасибо!

+0

Вы расширили класс в классе ItemPropertyFacebook? В любом случае вы должны удалить свойство id в своем дочернем классе. – RSez

+0

Да, мой класс ItemPropertyFacebook extends Item –

ответ

0

Я не знаком с поколением YAML, но когда я попробовал структуру с PHP аннотаций, это не работает для меня, никаких проблем с дублированным столбца ID:

/** 
* @ORM\Entity 
* @ORM\Table(name="items") 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="type", type="string") 
* @ORM\DiscriminatorMap({"item" = "Item", "item_property_facebook" = "ItemPropertyFacebook"}) 
*/ 
class Item { 

    /** 
    * @ORM\Column 
    * @ORM\Id 
    * @ORM\GeneratedValue() 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="string") 
    */ 
    protected $bundledType; 
} 

/** 
* @ORM\Entity 
* @ORM\Table(name="item_property_facebook") 
*/ 
class ItemPropertyFacebook extends Item { 

    /** 
    * @var 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue() 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="integer") 
    */ 
    protected $account_id; 
} 

будет генерировать эти SQL команды:

CREATE TABLE items (id VARCHAR(255) NOT NULL, bundledType VARCHAR(255) NOT NULL, type VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB; 
CREATE TABLE item_property_facebook (id VARCHAR(255) NOT NULL, account_id INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB; 
ALTER TABLE item_property_facebook ADD CONSTRAINT FK_B8C39352BF396750 FOREIGN KEY (id) REFERENCES items (id) ON DELETE CASCADE 

Единственная разница была, мне пришлось добавить "item = "Item" в DiscriminatorMap.

Кроме того, должна ли быть строка id: true в определении идентификатора? Кажется излишним для меня.

+0

Мне было интересно, почему в документации это единственный тип наследования, который не имеет примера yaml. Может быть, они должны добавить его, я попробую и отметьте ваш ответ как ответ, если он сработает. Я тоже напишу им, чтобы они добавили заметку в свою документацию. –

Смежные вопросы