Связь сущностей Symfony со значением не первичных ключей - PullRequest
0 голосов
/ 01 февраля 2019

Я сопоставляю базу данных, которая уже существует с доктриной, но это было спроектировано плохо, во-первых:

|--------------|    |----------------------|
|  Entity A    |    |  Entity B            |
|--------------|    |----------------------|
|ID   (Int)(PK)|    |ID           (Int)(PK)|
|FOO  (Str)    |    |BAR -> A.FOO (Str)    |
|--------------|    |----------------------|

Сущность B сохранила в базе данных A.FOO, а не A.Я БЫ.Таким образом, если сущность A меняет A.FOO, это не будет каскадно к сущности B.Так что я знаю, что это довольно ужасно, но я не смогу изменить их структуру в настоящее время ..

Есть ли способ сопоставить с доктриной в любом случае, как это?Похоже, я не могу, потому что A.FOO не является первичным ключом?

IN B ENTITY
/**
 * @ORM\OneToOne(targetEntity="App\Entity\A")
 * @ORM\JoinColumn(name="BAR", referencedColumnName="FOO")
 */

Итак, в конце я хотел бы получить форму для моей сущности B с ChoiceType, содержащим значения A.FOO.,Нужно ли создавать пользовательскую форму с OptionsResolver , извлекающим значения, или есть более простой прямой способ с доктриной?

1 Ответ

0 голосов
/ 01 февраля 2019

Невозможно использовать столбцы соединения, указывающие на неосновные ключи.Doctrine будет считать, что это первичные ключи, и будет создавать прокси с отложенной загрузкой данных, что может привести к неожиданным результатам.Doctrine может по соображениям производительности не проверять правильность этих настроек во время выполнения, а только с помощью команды Validate Schema.

(из https://www.doctrine -project.org / projects / doctrine-orm /о / 2.6 / ссылка / ограничения-и-известный-issues.html ).

Т.е. я не думаю, что существует какой-либо способ создать эту связь с аннотациями и иметь автоматическую проверку ссылочного ключа (или каскадные определения).Так что это оставило бы вас в неидеальной ситуации с точки зрения схемы, где у вас есть только два несвязанных столбца строки в двух таблицах - что в основном означало бы, что вам нужно будет обрабатывать больше вещей, чем просто обработку и проверку формыкак-то вручную: как проверки при удалении экземпляров B, выборка «связанных» сущностей на основе строковых значений и т. д.

Итак, суть в том, насколько я понимаю: нет способа, как «просто» управлять этимиспользуя доктрину.Простым решением было бы реорганизовать структуру базы данных, но если это было бы неприемлемо для вас, то я боюсь, что у вас будет довольно много работы, чтобы заставить это соединение работать так же, как это делают простые соединения доктрины.

...