Отображение ассоциации с отображенным суперклассом
В моем комплекте поставщика у меня есть 2 сопоставленных суперкласса: BaseSite и BaseSection (которые являются абстрактными).
В моем пакете приложений у меня есть 2 объекта, которые расширяют 2 сопоставленных суперкласса.
Все работает до сих пор: у меня есть доступ к полям, определенным в суперклассах, и я могу добавить новые в свой пакет приложений, если это необходимо.
Проблема заключается в том, что я пытаюсь определить мое сопоставление ассоциаций между этими объектами. (manyToOne между 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 вместо сайта). Я предполагаю, что это связано с тем, что сопоставленный суперкласс не знает имя таблицы, определенное в сущности приложения.
Я мог бы определить сопоставление ассоциаций для сущностей приложения, но это будет означать, что если кто-то захочет использовать мой пакет, ему нужно будет определить само отображение, чего я бы хотел избежать.
Есть ли другой способ сделать это или, может быть, я просто что-то упустил?
Вот мой код:
Поставщик:
Файл: 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
После прочтения руководства Doctrine по картографированию наследования в нем говорится:
Это означает, что ассоциации "один-ко-многим" невозможны в отображаемом суперклассе при всех
Возможно, стоит посмотреть на функции наследования таблицы.