Наследяване на доктрина - Single_Table наследява от Joined таблица

Това е конфигурацията, която искам да имам:

Обект „Акаунт“ с ПРИСЪЕДИНЕНО наследяване към два други обекта: „Автор“ и „АкаунтБекенд“.

Тогава бих искал „AccountBackend“ да има наследяване на SINGLE_TABLE с други два обекта: „Администратор“ и „Избран автор“. Това е начинът, по който ги дефинирам:

Account.php

/** 
 * @Entity (repositoryClass="Repositories\Account") 
 * @Table(name="accounts")  
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="discr", type="integer")
 * @DiscriminatorMap({"1"="Author","2"="AccountBackend"})
 * @HasLifecycleCallbacks
 */
class Account
{

Куратор.php

/**
 * @Entity
 * @Table(name="accounts_author")
 */
class Author extends Account
{

AccountBackend.php

/** 
 * @Entity (repositoryClass="Repositories\AccountBackend") 
 * @Table(name="accounts_backend")  
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="discr", type="integer")
 * @DiscriminatorMap({"1"="FeaturedAuthor","2"="Administrator"})
 * @HasLifecycleCallbacks
 */
class AccountBackend extends Account
{

FeaturedAuthor.php

/**
 * @Entity
 */
class FeaturedAuthor extends AccountBackend
{

Administrator.php

/**
 * @Entity
 */
class Administrator extends AccountBackend
{

Когато ги дефинирам, когато се опитам да направя актуализация през CLI, се казва

„Обект „Entities\AccountBackend“ трябва да бъде част от картата на дискриминатора на „Entities\Account“, за да бъде правилно картографиран в йерархията на наследяване. Като алтернатива можете да направите „Entities\AccountBackend“ абстрактен клас, за да избегнете възникването на това изключение.“

Не виждам нищо лошо в начина, по който ги дефинирах, това е първият път, когато се опитвам да имам наследяване на вече наследен обект. Някаква идея какво не е наред? Благодаря!


person raygo    schedule 01.04.2014    source източник


Отговори (2)


Имате нужда от случай за вашия клас "AccountBackend" във вашата @DiscriminatorMap

e.g

@DiscriminatorMap({"1"="FeaturedAuthor","2"="Administrator", "3"="AccountBackend"})

Както е обяснено в Документацията

Всички класове обекти, които са част от картографираната йерархия на обекти (включително най-горния клас), трябва да бъдат посочени в @DiscriminatorMap. В горния случай е включен класът на лицата.

person Peekmo    schedule 01.04.2014
comment
здрасти Имам това в моя Account.php обект - person raygo; 04.04.2014
comment
Да, но обектът на вашия акаунт не е част от наследството на SINGLE_TABLE. Трябва да добавите AccountBackend към DiscriminatorMap на вашата SINGLE_TABLE - person Peekmo; 04.04.2014

В случай, че сте дошли тук и сте имали проблем с наследяването на SINGLE_TABLE - възможно е проблемът да възниква, защото вашият дискриминаторен клас не е абстрактен.

Моят пример за случай (решение)

/**
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="entity", type="string")
 * @ORM\DiscriminatorMap({"product" = "ProductReview", "seller" = "SellerReview"})
 * @ORM\Table(name="reviews")
 */
abstract class Review {}

class ProductReview extends Review {}

class SellerReview extends Review {}
person Aurimas    schedule 08.04.2015