Symfony使用外键保存嵌入式表单

时间:2011-04-08 16:38:54

标签: forms symfony-1.4

我是一个symfony新手,我正在尝试创建一个系统来跟踪制造规范的修订。我正在使用symfony 1.4.9和Doctrine。

规格与修订之间存在一对多的关系。在创建新规范时,还必须创建初始“修订版”,其中包含大部分相关数据。换句话说,我需要能够同时创建规范和连接的版本。

我已经为规格和修订创建了表单。我可以单独使用表单,它们按预期运行。嵌入时表单可正确呈现,并按预期进行验证。为现有规范创建新版本可以正常工作。当我尝试创建一个新的规范及其所需的版本时,我的问题出现了。

Revision的外键是Specification的主键。在将规范记录添加到数据库之前,该主键不存在。嵌入式表单保存因MySQL错误而失败,因为Revision的外键字段不能为空。

最好的方法是什么?我的想法是更改架构以允许外键为null。我将能够保存表单,然后根据表单的值进行查询以确定新规范的主键设置为什么,那么我应该能够将相关的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.class.php中的此命令嵌入到SpecificationsForm中:

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

当specification_id已经存在时,我可以很容易地使整个工作正常工作,但是在为我的Requirements SpecificationsForm调用$ form-> save()之前我没有办法做到这一点。我觉得我错过了一些非常明显的东西,但symfony文档在嵌入表单上非常稀疏。

如果没有其他解决方案出现,Versionable看起来会完成这项工作(尽管有大量重复数据)。

1 个答案:

答案 0 :(得分:0)

我会让自己轻松生活并使用Versionable behavior

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

如果您使用SpecificationForm作为主要表单并将RevisionForm嵌入其中,那说这应该可以解决。请发布嵌入过程和模式定义的代码。