Присвоение имени отношению в Doctrine 2 ORM?

#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, а не в файле на моем локальном компьютере.