Doctrine / Symfony теряет M: N отношений при сохранении

#database #symfony1 #doctrine #yaml

#База данных #symfony1 #доктрина #yaml

Вопрос:

Я предполагаю, что это проблема конфигурации с моей Doctrine schema.yml, но я не вижу, как найти правильный ответ здесь.

У меня есть две таблицы, BetaMeeting и ProjectTester, которые формируют отношения «многие ко многим» через BetaMeetingAttendee. Все работает нормально, и я могу отредактировать бета-собрание, например, чтобы включить несколько тестировщиков проекта, и все отношения будут сохранены правильно. Однако, когда я редактирую тестер проекта, у которого уже есть существующие отношения с бета-собранием (встречами), при сохранении M: N отношения теряются. При использовании Symfony 1.4.13 и генератора администратора, Doctrine 1.2 и страницы редактирования для тестировщика проекта не упоминаются отношения «многие ко многим», нет скрытых полей и т.д. Может ли это быть причиной того, что данных там нет, поэтому Doctrine удаляет их? Я не думал, что это будет необходимо включить.

Моя схема.yml выглядит следующим образом, с удалением нерелевантных деталей.

 BetaMeeting:
  connection: doctrine
  tableName: BetaMeeting
  columns:
    id:              { type: integer(4), primary: true, autoincrement: true }
    project_id:      { type: integer(4) }
    date:            { type: date }
  relations:
    Project:
      local: project_id
      foreign: id
      foreignAlias: BetaMeetings
    ProjectTester:
      class: ProjectTester
      refClass: BetaMeetingAttendee
      foreignAlias: BetaMeetings

BetaMeetingAttendee:
  connection: doctrine
  tableName: BetaMeetingAttendee
  columns:
    beta_meeting_id:   { type: integer(4), primary: true, autoincrement: false }
    project_tester_id: { type: integer(4), primary: true, autoincrement: false }
  relations:
    BetaMeeting:
      foreignAlias: BetaMeetingAttendees
    ProjectTester:
      foreignAlias: BetaMeetingAttendees

ProjectTester:
  connection: doctrine
  tableName: ProjectTester
  columns:
    id:                  { type: integer(4), primary: true, autoincrement: true }
    tester_id:           { type: integer(4) }
    project_id:          { type: integer(4) }
  relations:
    Tester:
      local: tester_id
      foreign: id
      foreignAlias: Projects
    Project:
      local: project_id
      foreign: id
      foreignAlias: ProjectTesters
  

Есть какие-либо подсказки относительно того, почему отношения удаляются после редактирования, которое касается только непосредственных атрибутов объекта ProjectTester?

Ответ №1:

Если у вас есть поле, определенное в форме, но вы исключили его из генератора.yml это похоже на отправку пустого поля, и поэтому оно очищает отношения.

Вы должны отменить это поле в Form.class таким образом, поле сохраняет текущие значения.

 public function configure()
{
  unset($this['beta_meeting_list']); // or the correct value
}
  

Комментарии:

1. Фантастический самура! Я не думал об этом аспекте, но это имеет смысл и работает как шарм. Из любопытства, на что именно это ссылается, когда мы говорим $this[] ? Я привык обращаться к вещам, более похожим $this->widgetSchema[] .

2. Ну. Я точно не знаю внутренностей формы. Но если вы сделаете это $this['beta_meeting_list'] вместо $this->widgetSchema['beta_meeting_list'] , вы отключите как виджет, так и средство проверки.