Сопоставление карт с сопоставленным суперклассом - PullRequest
15 голосов
/ 27 марта 2012

В моем комплекте поставщиков у меня есть 2 сопоставленных суперкласса: BaseSite и BaseSection (которые являются абстрактными).

В моем комплекте приложений есть 2 объекта, которые расширяют 2 сопоставленных суперкласса. Пока все работает: у меня есть доступ к полям, определенным в суперклассах, и я могу добавить новые в свой комплект приложений, если это необходимо.

Проблема в том, что я пытаюсь определить свое сопоставление связей между этими сущностями. (многие между BaseSection и BaseSite). Если я определю его в сопоставленном суперклассе BaseSection, я смогу выполнить команду app/console doctrine:generate:entities AcmeDemoBundle, но она не работает, когда Я пытаюсь создать таблицы: (app/console doctrine:schema:update --dump-sql)

CREATE TABLE Section (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, siteId INT DEFAULT NULL, INDEX IDX_95E06DEFFADB670C (siteId), PRIMARY KEY(id)) ENGINE = InnoDB;
CREATE TABLE Site (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB;
ALTER TABLE Section ADD CONSTRAINT FK_95E06DEFFADB670C FOREIGN KEY (siteId) REFERENCES BaseSite(id) ON DELETE CASCADE

Как видите, он пытается ссылаться на внешний ключ в несуществующей таблице (BaseSite вместо Site). Я предполагаю, что это потому, что сопоставленный суперкласс не знает имя таблицы, определенной в объекте приложения.

Вместо этого я мог бы определить сопоставление ассоциации для сущностей приложения, но это означало бы, что если бы кто-то захотел использовать мой пакет, он сам должен был бы определить отображение, чего я хотел бы избежать.

Есть ли другой способ сделать это или, может быть, я просто что-то упустил?

Вот мой код:

Поставщик:

Файл: vendor \ bundles \ Acme \ DemoBundle \ Resources \ config \ doctrine \ BaseSite.orm.yml

Acme\DemoBundle\Entity\BaseSite:
  type: mappedSuperclass
  fields:
    id:
      type: integer
      id: true
      generator:
        strategy: AUTO
    name:
      type: string
      length: 255
      nullable: false
    // ...

Файл: vendor \ bundles \ Acme \ DemoBundle \ Resources \ config \ doctrine \ BaseSection.orm.yml

Acme\DemoBundle\Entity\BaseSection:
  type: mappedSuperclass
  fields:
    id:
      type: integer
      id: true
      generator:
        strategy: AUTO
    name:
      type: string
      length: 255
      nullable: false
    // ...
  manyToOne:
    site:
      targetEntity: Acme\DemoBundle\Entity\BaseSite
      joinColumn:
        name: siteId
        referencedColumnName: id
        onDelete: cascade

Применение:

Файл: src \ Application \ Acme \ DemoBundle \ Resources \ config \ doctrine \ Site.orm.yml

Application\Acme\DemoBundle\Entity\Site:
  type: entity
  table: Site

Файл: src \ Application \ Acme \ DemoBundle \ Entity \ Site.php

<?php

namespace Application\Acme\DemoBundle\Entity;

use Acme\DemoBundle\Entity\BaseSite;

class Site extends BaseSite
{
}

Файл: src \ Application \ Acme \ DemoBundle \ Resources \ config \ doctrine \ Section.orm.yml

Application\Acme\DemoBundle\Entity\Section:
  type: entity
  table: Section

Файл: src \ Application \ Acme \ DemoBundle \ Entity \ Section.php

<?php

namespace Application\Acme\DemoBundle\Entity;

use Acme\DemoBundle\Entity\BaseSection;

class Section extends BaseSection
{
}

1 Ответ

4 голосов
/ 27 марта 2012

После прочтения Учения о наследовании в нем говорится:

Это означает, что однозначные ассоциации вообще невозможны для сопоставленного суперкласса

Возможно, стоит взглянуть на функции наследования таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...