Генерируемый уникальный ключ в реляционной доктрине - PullRequest
0 голосов
/ 07 марта 2012

Я пытаюсь создать связь OneToMany между таблицами ответов и вопросов в Doctrine. Это базовые схемы YAML

Схема ответа

  type: entity
  table: fs_answer
  fields:
    id:
      id: true
      type: integer
      unsigned: false
      nullable: false
      generator:
        strategy: IDENTITY
    questionId:
      type: integer
      unsigned: false
      nullable: false
      column: question_id
    body:
      type: text
      nullable: false
  oneToOne:
    question:
      targetEntity: FsQuestion
      cascade: {  }
      mappedBy: null
      inversedBy: null
      joinColumns:
    question_id:
      referencedColumnName: id
      orphanRemoval: false
  lifecycleCallbacks: {  }

Схема вопроса:

  type: entity
  table: fs_question
  fields:
    id:
      id: true
      type: integer
      unsigned: false
      nullable: false
      generator:
        strategy: IDENTITY
    body:
      type: text
      nullable: false
  oneToMany:
    answer:
      targetEntity: FsAnswer
      cascade: {  }
      mappedBy: question
      inversedBy: answers
      joinColumns:
    question_id:
      referencedColumnName: id
      orphanRemoval: false
  lifecycleCallbacks: {  }

Когда я обновляю схему с помощью doctrine:schema:update, она генерирует приведенный ниже код SQL и помещает unique key в 'question_id' в таблице ответов.

CREATE TABLE IF NOT EXISTS `fs_answer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `question_id` int(11) NOT NULL,
  `body` longtext NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQ_552D082B1E27F6BF` (`question_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

Как избежать этого уникального ключевого материала? По логике (один ко многим) в таблице ответов не должно быть уникального ключа для идентификатора вопроса.

Ответы [ 2 ]

1 голос
/ 08 марта 2012

На самом деле это так просто, как код ниже

Вопрос:

oneToMany:
  answer:
    targetEntity: FsAnswer
    mappedBy: question
    cascade: ["persist"]

Ответ:

manyToOne:
  question:
    targetEntity: FsQuestion
    inversedBy: answer
0 голосов
/ 07 марта 2012

Каждый ответ имеет один и только один вопрос, верно?Тот факт, что вы определили его как своего рода oneToOne, подтверждает это.

И похоже, что ваш joinColumn испорчен.Удивило, что это не вызвало ошибок.

Просмотрите примеры в руководстве по доктрине:

http://docs.doctrine -project.org / projects / doctrine-orm / en / 2.1 / reference/association-mapping.html

...