#symfony #doctrine #doctrine-orm #yaml
#symfony #доктрина #doctrine-orm #yaml
Вопрос:
Как я могу задать имя внешнего ключа (редактировать: не имя самого атрибута) для отношения «регион» «многие к одному», используя YAML?
SWATestBundleEntityProvince:
type: entity
table: province
uniqueConstraints:
UNIQUE_PROVINCE_CODE:
columns: code
id:
id:
type: integer
generator: { strategy: AUTO }
fields:
code:
type: integer
name:
type: string
length: 255
short_name:
type: string
length: 2
manyToOne:
region:
targetEntity: Region
inversedBy: provinces
Ответ №1:
Посмотрите на метод getCreateConstraintSQL в классе AbstractPlatform, чтобы увидеть, как выбирается имя внешнего ключа (строка 1088).
Оно берется непосредственно из имени ограничения. Влияние имени ограничения повлияет на имя внешнего ключа.
В качестве обходного пути вы можете удалить ограничение и воссоздать его с новым именем при переносе doctrine.
Комментарии:
1. Значит, нет «стандартного» способа его изменения — кроме процедуры миграции? Я думаю, имя совершенно случайное, например, FK_28392f89329.
2. Ну, вы могли бы перегрузить класс platform, но я не думаю, что это того стоит только ради присвоения имени ограничению.
3. Как можно «повлиять на имя ограничения» для внешних ключей?
Ответ №2:
Из-за ответа @JakubZalas я просмотрел код в Github и увидел, что изменить код фреймворка для выполнения того, что вы хотите, действительно легко.
Если вы проверите папку, в которой находится класс AbstractPlatform, вы увидите, что там есть класс ForeignKeyConstraint . В нем вы увидите, что он наследуется от AbstractAsset.
Теперь класс AbstractAsset имеет метод _generateIdentifierName . Если вы проверите этот метод в github, вы увидите, что у него есть закомментированная часть, которая делает именно то, что вы хотите. Вы просто раскомментируете эту часть, прокомментируете фактическую активную часть, измените параметр $prefix на $postfix и готово. Имя ограничения будет сгенерировано с использованием имен таблиц и столбцов с соответствующим постфиксом.
The AbstractAsset.php файл находится в этой папке: Symfony/vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema
Я попробовал в своем проекте, и это сработало нормально.
И последняя информация: по крайней мере, для моего проекта упомянутая выше часть с комментариями находится только в github, а не в файле на моем локальном компьютере.