Доктрина не экспортирует отношения должным образом - PullRequest
0 голосов
/ 28 апреля 2010

У меня есть база данных MySQL 5.1.41, которую я пытаюсь заполнить доктриной, но доктрина неправильно вставляет отношения. Мой YAML:

Locatie:
 connection: doctrine
 tableName: locatie
  columns:
   loc_id:
    type: integer(4)
    fixed: false
    unsigned: false
    primary: true
    autoincrement: true
  org_id:
    type: integer(4)
    fixed: false
    unsigned: false
    primary: false
    notnull: false
    autoincrement: false
  naam:
    type: string(30)
    fixed: false
    unsigned: false
    primary: false
    notnull: true
    autoincrement: false
  straat:
    type: string(30)
    fixed: false
    unsigned: false
    primary: false
    notnull: true
    autoincrement: false
  huisnummer:
    type: integer(4)
    fixed: false
    unsigned: false
    primary: false
    notnull: true
    autoincrement: false
  huisnummer_achtervoegsel:
    type: string(3)
    fixed: false
    unsigned: false
    primary: false
    notnull: false
    autoincrement: false
  plaats:
    type: string(25)
    fixed: false
    unsigned: false
    primary: false
    notnull: true
    autoincrement: false
  postcode:
    type: string(6)
    fixed: false
    unsigned: false
    primary: false
    notnull: true
    autoincrement: false
  telefoon:
    type: string(12)
    fixed: false
    unsigned: false
    primary: false
    notnull: true
    autoincrement: false
  opmerking:
    type: string()
    fixed: false
    unsigned: false
    primary: false
    notnull: false
    autoincrement: false
  inloggegevens:
    type: string()
    fixed: false
    unsigned: false
    primary: false
    notnull: false
    autoincrement: false
relations:
  Organisatie:
    local: org_id
    foreign: org_id
    type: one
    onDelete: CASCADE
    onUpdate: CASCADE

Organisatie:
  connection: doctrine
  tableName: organisatie
  columns:
    org_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    naam:
      type: string(30)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    straat:
      type: string(30)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    huisnummer:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    huisnummer_achtervoegsel:
      type: string(3)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    plaats:
      type: string(25)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    postcode:
      type: string(6)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    telefoon:
      type: string(12)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    opmerking:
      type: string(255)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
  relations:
    Locatie:
      local: org_id
      foreign: org_id
      type: many

Теперь, если создать организацию, а затем создать местоположение, в котором есть посторонний ключ к организации, все в порядке. но когда я пытаюсь обновить org_id с помощью phpmyadmin, я получаю сообщение об ошибке. Если я вручную установил внешний ключ в ON_UPDATE CASCADE, он сработает.

Почему доктрина не устанавливает эту опцию?

Я заставил его работать в Propel, но я действительно хочу использовать для этого доктрину.

1 Ответ

0 голосов
/ 28 апреля 2010

Ну, вы не можете обновить org_id, потому что на него ссылается таблица местоположений. Если вы измените его, это будет означать, что у организации есть местоположение, которого не существует - внешний ключ не работает. Сначала вставьте данные о своем местоположении, а затем все значения местоположений станут возможными значениями для организаций или, как вы упомянули, используйте действия onCascade.

Кроме того, вы можете сначала определить таблицу Organisatie и включить объявление отношения только для этой таблицы (для Doctrine достаточно одного определения). Теперь ссылка на таблицу Locatie становится доступной, и вы можете свободно играть с ее ключами. Конечно, вы все еще не можете ссылаться на что-то из таблицы Organisatie, которая не существует.

Я также заметил, что ваша схема в настоящее время говорит, что «в одной организации много мест», хотя я предполагаю, что вы предполагали, что «в одном месте много организаций». Если это действительно так, измените Organisatie-> Relations-> Locatie на «type: one, foreignType: many» и удалите объявление взаимосвязи из таблицы Locatie.

Надеюсь, это поможет.

...