Отношения «многие ко многим» сбрасываются при обновлении иностранной сущности в Symfony - PullRequest
0 голосов
/ 30 декабря 2011

Я работаю с Symfony 1.2 (не могу обновить, мне решать) с Propel в качестве ORM. У меня странная проблема с моими отношениями «многие ко многим».

Допустим, у вас есть две таблицы A и B и отношение «многие ко многим» A_has_B. Допустим, у меня есть сущность a в A, сущность b в B и отношение в A_has_B, для которого PK равен (a_id, b_id). Теперь, если я обновлю сущность b (не ее идентификатор, а другое поле, не являющееся ее PK), используя модули, сгенерированные администратором Symfony, то (a_id, b_id) удаляется из базы данных.

Это происходит только с использованием бэкэнда Symfony. Это не происходит с помощью phpmyadmin, где я могу обновить a и b без потери отношения (a_id, b_id).

Все таблицы MySQL / InnoDB. Столбцы A_id и B_id в A_has_B являются внешними ключами, указывающими на идентификаторы A и B. У меня есть ON DELETE CASCADE и ON UPDATE CASCADE в обоих столбцах.

Большое спасибо за помощь.

ОБНОВЛЕНИЕ: Вот схема yml для трех таблиц Team и Participants и ее отношение

propel:
  _attributes:
    package: lib.model
    defaultIdMethod: native
  team:
    _attributes: { phpName: Team }
    id: { type: INTEGER, size: '11', primaryKey: true, autoIncrement: true, required: true }
    name: { type: VARCHAR, size: '255', required: true }
    description: { type: LONGVARCHAR, required: false }
  participant:
    _attributes: { phpName: Participant }
    id: { type: INTEGER, size: '11', primaryKey: true, autoIncrement: true, required: true }
    name: { type: VARCHAR, size: '255', required: true }
  team_has_participant:
    _attributes: { phpName: TeamHasParticipant }
    team_id: { type: INTEGER, size: '11', primaryKey: true, required: true, foreignTable: team, foreignReference: id, onDelete: CASCADE, onUpdate: CASCADE }
    participant_id: { type: INTEGER, size: '11', primaryKey: true, required: true, foreignTable: participant, foreignReference: id, onDelete: CASCADE, onUpdate: CASCADE }
    _indexes: { participant_id: [participant_id] }

Скажем, я обновляю description поле в team сущности, затем я теряю все team_has_participant отношения, которые имели эту внешнюю team сущность.

1 Ответ

0 голосов
/ 31 декабря 2011

Хорошо, я понял, в чем проблема.Конечно, что-то глупое.

В моих отношениях, скажем, A_has_B Я скрывал поле a_has_b_list в B generator.yml, чтобы разрешить изменения только из формы A.Но это ошибка, потому что простое скрытие поля в generator.yml не отменяет его, просто скрывает его, и оно публикуется с пустым значением (поэтому оно переопределяет базу данных).Необходимо сбросить виджет в B форме configure() метод:

unset($this->widgetSchema['a_has_b_list'];

Таким образом, ничего не публикуется и база данных не переопределяется.

...