Doctrine Inheritance — наследование Single_Table от объединенной таблицы

Это конфигурация, которую я хочу иметь:

Сущность «Учетная запись» с НАСЛЕДОВАНИЕМ ОБЪЕДИНЕННОГО наследования двух других сущностей: «Автор» и «AccountBackend».

Затем я хотел бы, чтобы «AccountBackend» имел наследование SINGLE_TABLE с двумя другими сущностями: «Администратор» и «FeaturedAuthor». Вот как я их определил:

Аккаунт.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
{

Администратор.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 включен.

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