Борьба с отношением «один ко многим» в форме администратора

Я извиняюсь, если ответ на мой вопрос будет очень очевиден. Я новичок в Symfony, и мне не удалось найти другой вопрос с той же проблемой, что и у меня в SO, поэтому я задаю вопрос. (И Google тоже не помог, но опять же я не очень хорошо знаком с терминологией Symfony, поэтому я мог бы неправильно сформулировать свои запросы.)

Итак, прямо к делу. Схема.yml :

user: id: email: { type: varchar, size: 255, required: true } ... # etc. partner: user_id: { type: integer, foreignTable: user, foreignReference: id } 

(BTW, используя Symfony 1.3 и Propel 1.4).

Таким образом, у меня созданы методы $ user-> getPartners () и $ partner-> getUserId () (хотя я где-то читал, что если ваш FK является PK в указанной таблице, Propel устанавливает отношения один к одному, но я наблюдаю один-ко-многим, если я не ошибаюсь). Хорошо. Тем не менее, у меня есть модуль администратора для редактирования Пользователя, и в настоящий момент я боюсь даже понять, как именно я должен заставить Symfony отображать список партнеров в форме «Пользователь / редактировать» (двойной список будет в порядке слишком).

Попробовал поместить «partners» и «partner_list» в apps / backend / modules / user / generator.yml (где я уже успешно добавил логические и статические выборки [через поля * Peer :: getXXXChoices () ]), только для получить ошибки «партнеров Widget» не существует ».

Я мог бы изменить класс формы, я думаю, но я не знаю, как сообщить Propel сформировать визуальные отношения «один ко многим», используя «multiple = true», потому что «выбор» не является статическим; это зависит от другой таблицы.

Итак, как мне это сделать? Не стесняйтесь спрашивать дополнительные данные, если я опускаю что-то важное.

С уважением.

Однажды я столкнулся с одной проблемой, так что это мое решение проблемы. Symfony не очень умна в таких ситуациях, поэтому вам нужно немного помочь. Модель, которую вы описываете, является хорошей реляционной модельной интерпретацией проблемы:

 user: id: email: { type: varchar, size: 255, required: true } ... # etc. partner: user_id: { type: integer, foreignTable: user, foreignReference: id } 

Дело в том, что Symfony действительно упрощает его, и когда Propel генерирует формы форм и генераторов, чтобы сохранить данные, он интерпретирует поле user_id, как если бы это было какое-то нормальное поле (а не по-одному).

Поэтому, если вы действительно хотите, чтобы этот мультиселектор, созданный symfony, и вся его логика, которые должны были быть созданы для вас, вам нужно создать много-много отношений между этими двумя классами. Схема должна закончиться чем-то вроде этого:

 user: id: email: { type: varchar, size: 255, required: true } ... # etc. partner: user_id: { type: integer, foreignTable: user, foreignReference: id } user_partner: user_id: { type: integer , foreignTable: user, foreignReference: id, primaryKey: true} partner_id: { type: integer , foreignTable: partner, foreignReference: id, primaryKey: true} 

Таким образом, у вас будет виджет partner_list в форме пользователя, а также виджет user_list в форме партнера. Я всегда отключаю тот, который мне не нужен, и действительно работает как шарм.

Другие решения, наиболее подходящие для вашей реализации модели, немного сложнее, потому что вам нужно будет изменить UserForm и добавить виджет multiselect partner_ids, а затем изменить метод doSave, чтобы иметь возможность обрабатывать логику сохранения мультиселекта (создавать экземпляры, связать их с пользователем и сохранить их, а также удалить те, которые не выбраны).