Я немного новичок в 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 выглядит так, как будто он сделает свою работу (хотя с большим количеством повторныхданные).