Symfony Сохранение встроенной формы с внешним ключом - PullRequest
0 голосов
/ 08 апреля 2011

Я немного новичок в Symfony и пытаюсь создать систему для отслеживания изменений в производственных спецификациях.Я использую Symfony 1.4.9 с Doctrine.

У меня есть отношение один ко многим между Спецификациями и Редакциями.При создании новой Спецификации также необходимо создать начальную «Редакцию», которая содержит большую часть релевантных данных.Другими словами, мне нужно иметь возможность одновременно создавать Спецификацию и связанную Редакцию.

Я создал формы для Спецификаций и для Редакций.Я могу использовать формы индивидуально, и они функционируют, как и ожидалось.Формы правильно отображаются при внедрении и проверяются, как и ожидалось.Создание новой редакции для существующей спецификации работает нормально.Моя проблема возникает, когда я пытаюсь создать новую Спецификацию и ее требуемую редакцию.

Внешний ключ редакции является первичным ключом спецификации.Этот первичный ключ не существует, пока запись спецификации не будет добавлена ​​в базу данных.Сохранение встроенной формы завершается с ошибкой MySQL, поскольку поле внешнего ключа Revision не может быть пустым.

Как лучше всего это обойти?Моя мысль состоит в том, чтобы изменить схему, чтобы внешний ключ был нулевым.Я смогу сохранить формы, а затем выполнить запрос, основанный на значениях формы, чтобы определить, на что был установлен первичный ключ новой Спецификации, ТО тогда я смогу установить внешний ключ соответствующей редакции на это значение.Хотя это кажется смешно запутанным и приведет к двум дополнительным запросам, которые, по-видимому, на самом деле должны требоваться.

Самый простой способ сделать это - перестать пытаться использовать функциональность встроенной формы и перейти к выполнению этого в два этапа (создать и сохранить спецификацию, затем создать и сохранить соответствующую ревизию) - однакоМой клиент не хочет этого, поэтому это не вариант.

Я действительно надеюсь, что мне чего-то не хватает в рамках и что есть более простой способ обойти это.Есть идеи?

Редактировать:

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

Specifications:
  connection: doctrine
  tableName: specifications
  columns:
    specification_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    specification_name:
      type: string(10)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
  relations:
    Revisions:
      local: specification_id
      foreign: specification_id
      type: many

Revisions:
  connection: doctrine
  tableName: revisions
  columns:
    revision_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    specification_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    revision_is_current:
      type: integer(1)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    revision_effective_date:
      type: date(25)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    revision_name:
      type: string(20)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    revision_deactivated_date:
      type: date(25)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    revision_filename:
      type: string(40)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
  relations:
    Specifications:
      local: specification_id
      foreign: specification_id
      type: one

RevisionsForm встраивается в SpecificationsForm с помощью этой команды в SpecificationsForm.class.php:

$newRevision = new RevisionsForm();    
$this->embedForm('Revision', $newRevision;

Я могу легкозаставить все это работать, когда spec_id уже существует, но я не вижу способа сделать это, пока не будет вызвана $ form-> save () для родительского SpecificationForm.Я чувствую, что упускаю что-то очень очевидное, но документация Symfony очень разбросана по встроенным формам.

Если ни одно другое решение не представляется, Versionable выглядит так, как будто он сделает свою работу (хотя с большим количеством повторныхданные).

1 Ответ

0 голосов
/ 08 апреля 2011

Я бы упростил себе жизнь и использовал бы Версионное поведение .

Specification:
  actAs:
    Versionable: 
      versionColumn: version
      className: %CLASS%Version
      auditLog: true
  columns:
    #your columns here

При этом все должно работать "из коробки", если вы используете SpecificationForm в качестве основногоформа и вложение RevisionForm в него.Пожалуйста, опубликуйте свой код для процесса встраивания и определения вашей схемы.

...