Наследование в Symfony3 с дискриминатором - PullRequest
0 голосов
/ 28 апреля 2018

Я хочу создать описание этой таблицы в symfony:

GeneralAssignment:

  • id (int)
  • имя (текст)
  • курс (курс)
  • тип (1 | 2)
  • присваивание (Назначение1, если тип == 1 | Назначение2, если тип == 2)

Курс:

  • id (int)
  • имя (текст)

Assignment1:

  • id (int)
  • general_assignment (GeneralAssignment)

Assignment2:

  • id (int)
  • general_assignment (GeneralAssignment)

Итак, лучшее решение - использовать эту схему отношений:

[Простое отношение ManyToOne] (курс): Course.id <------> GeneralAssignment.course (GeneralAssignment)

И

[ОБЪЕДИНЕННЫЙ тип наследования] (GeneralAssignment): GeneralAssignment.type [1 = Назначение1 | 2 = Назначение2]

Итак, я получу модель этого класса (извините за это плохое фото):

class model

Проблема

Я использовал для создания этой модели, потому что сначала хочу создать курс, затем создать общее назначение с использованием идентификатора курса и, наконец, создать конкретное назначение с использованием идентификатора общего назначения

Проблема в том, что я не могу создать отношение доктрины отношений между Assignment1 и GeneralAssignment с помощью Assignment1.general_assignment: «Не удается создать экземпляр абстрактного класса AssignmentGeneral». (то же самое между Assignment2 и AssignmentGeneral).

Мне нужен атрибут Assignment1.assignment_general, потому что я собираюсь использовать классы Assignment1 и Assignment2 позже, и если я не могу знать идентификатор general_assignment, я даже не могу знать общую информацию о назначении из-за наследования от AssignmentGeneral для определенные классы Назначения (Назначение1, Назначение2)

AssignmentGeneral является абстрактным классом, поскольку DiscriminatorMap требует, чтобы класс был абстрактным.

Так что мне делать?

Я не могу установить AssignmentGeneral из "abstract class" в "class" и не могу создать связь между Assignment1 (или Assignment2) и GeneralAssignment в Assignment1

PS: Эти имена классов не настоящие, но они похожи на мою настоящую проблему. Просто, чтобы разобраться, я раскрыл эту простую проблему.

Большое спасибо за каждый ответ

С наилучшими пожеланиями

[Изменить] Я добавляю Генеральную декларацию Назначения

/**
 *
 * @ORM\Table(name="assignment_general")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="integer")
 * @ORM\MappedSuperclass
 * @ORM\DiscriminatorMap({
       1 = "Assignment1",
 *     2 = "Assignment2"
 * })
 */
abstract class StatisticsGeneralAbstract
{
 //...
}

А также:

/**
 *
 * @ORM\Table(name="assignment1")
 * 
 */
class Assignment1 extends AssignmentGeneral
{
//...
}

/**
 *
 * @ORM\Table(name="assignment2")
 * 
 */
class Assignment2 extends AssignmentGeneral
{
//...
}

1 Ответ

0 голосов
/ 29 апреля 2018

Наследование таблицы классов ('JOINED') не требует, чтобы родительский класс был абстрактным.

Кроме того, одним из преимуществ наследования является получение свойств родителя при создании экземпляра дочернего класса. Так что вам не нужно создавать оба экземпляра, просто создайте экземпляр Assignment1 или Assignment2.

Добавьте отношения к ним обоим в объекте Course и свойстве assignmentType, чтобы вы знали, с каким из них он связан.

...