Doctrine Custom Discriminator map - PullRequest
       1

Doctrine Custom Discriminator map

0 голосов
/ 05 июня 2018

Так что я работаю над интеграцией Symfony 3 в унаследованную кодовую базу, и по большей части все хорошо.К сожалению, у меня возникли некоторые проблемы с наследованием одной таблицы со странным дискриминатором.ПРИМЕЧАНИЕ: я не могу изменить схему (по крайней мере, в ближайшее время), потому что она связана с большим количеством старого кода.

У меня есть классическое сопоставление Person -> Employee.При этом у меня есть 2 таблицы:

  • Company
  • Person

, которые переводятся в 3 объекта

  • Company
  • Лицо
    • Сотрудник

Это кажется довольно простым, за исключением того, что единственным жизнеспособным дискриминатором является company_id, который представляет собой столбец для лица, обозначающий, какую компаниючеловек принадлежит.Если company_id = 1, это сотрудник, в противном случае это просто обычный человек.

Так что, насколько я могу судить, мне нужна карта, которая выглядит следующим образом:

/**
 * @InheritanceType( "SINGLE_TABLE" )
 * @DiscriminatorColumn( name = "company_id", type = "integer" )
 * @ORM\DiscriminatorMap({
 *      1 = "Employee",
 *      2 = "Person",
 *      3 = "Person",
 *      ...
 *      5001 = "Person"
 *   })
 *
 * @ORM\Table(name="person")
 * @ORM\Entity
 */
class Person
{}

ЭтоСпособ картирования невозможно поддерживать.Я посмотрел вокруг, но я не нашел хорошего решения для этого.Сейчас я использую суперкласс Mapped, а затем указываю Person и Employee на таблицу person, которая работает с точки зрения кода, но если я запускаю схему, проверьте ее ошибки, так как имя таблицы уже существует.Это затрудняет поддержание отображения.

1 Ответ

0 голосов
/ 05 июня 2018

Честно говоря, я не уверен, возможно ли что-то подобное, потому что это было бы отчасти сумасшедшим для сгенерированных запросов (особенно, если у вас много записей).

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

...