Называть отношения в Doctrine 2 ORM? - PullRequest
7 голосов
/ 02 октября 2011

Как я могу установить имя внешнего ключа ( изменить : не имя самого атрибута) для отношения "регион" "многие-к-одному" с использованием YAML?

SWA\TestBundle\Entity\Province:
  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

Ответы [ 2 ]

11 голосов
/ 11 октября 2011

Посмотрите на метод getCreateConstraintSQL в классе AbstractPlatform , чтобы увидеть, как выбирается имя внешнего ключа ( строка 1088 ).

Он берется непосредственно из имени ограничения. Влияние имени ограничения будет влиять на имя внешнего ключа.

В качестве обходного пути вы можете удалить ограничение и воссоздать его с новым именем в миграции доктрины .

1 голос
/ 12 июня 2014

Благодаря ответу @JakubZalas, я взглянул на код в Github и увидел, что изменение кода платформы для выполнения того, что вы хотите, действительно легко.

Если вы проверите папку, в которой находится класс AbstractPlatform, вы увидите, что существует класс ForeignKeyConstraint. В нем вы увидите, что он наследуется от AbstractAsset.

Теперь у класса AbstractAsset есть метод _generateIdentifierName. Если вы проверите этот метод в github , вы увидите, что он имеет закомментированную часть, которая делает именно то, что вы хотите. Вы просто раскомментируете эту часть, прокомментируете действительную активную часть, измените параметр $ prefix на $ postfix, и все готово. Имя ограничения будет сгенерировано с использованием имен таблиц и столбцов с соответствующим постфиксом.

Файл AbstractAsset.php находится в этой папке: Symfony / vendor / doctrine / dbal / lib / Doctrine / DBAL / Schema

Я пытался в моем проекте, и это работало нормально.

Одна заключительная информация: по крайней мере для моего проекта упомянутая выше прокомментированная часть есть только в github, а не в файле на моей локальной машине.

...