【问题标题】:Symfony: update a related table with the id for newly saved records?Symfony:使用新保存记录的 id 更新相关表?
【发布时间】:2010-01-12 17:56:56
【问题描述】:

我有一个名为 SnUser 的基表和一个相关表 SnAltceva

SnUser:
    columns:
        name: { type: string(100) }
        age: { type: integer(1) }
        level_id: integer
    relations:
        SnAltceva: { local: id, foreign: user_id }

SnAltceva:
    columns:
        user_id: integer
        field_1: string(10)
        field_2: integer(1)
    relations:
        SnUser:
            local: user_id
            foreign: id
            onDelete: CASCADE 

我创建了 SnUser 表单并将其嵌入到一个新的 SnAltceva 表单中。一切正常,sn_user 表已更新为新记录,sn_altceva 也是,但 user_id 为 NULL。

我希望使用来自SnUser 的新插入的 if 来更新此字段。 我怀疑我需要从/lib/model/doctrine/SnUser.class.php 覆盖save(),但不太确定如何。

有什么建议吗?

【问题讨论】:

    标签: forms symfony1 save


    【解决方案1】:

    找到了:

    class SnUserForm extends BaseSnUserForm {
        public function configure() {
           // get the SnAltceva object reference (embeded one)
           // if not, create a new one
           $altObj = $this->getObject()->getSnAltceva();
           if( is_null($altObj) ) {
                $altObj = new SnAltceva();
                $this->getObject()->setSnAltceva($altObj);
           }
    
           // create the form with the already linked obj
           $formAlt = new SnAltcevaForm($altObj);
    
           $this->embedForm('altceva', $formAlt);
        }
    }
    

    无需重写 SnUser() 类中的 save() 方法。相关表将自动保存为正确的(新)id。

    希望它对未来的其他人有所帮助。

    【讨论】:

      【解决方案2】:

      您需要覆盖 save 以首先保存用户对象。然后从 Altceva 的嵌入表单中获取对象并在其上设置用户 ID。然后保存该对象。

      sfGuardPlugins(包括 Doctrine 和 Propel)在保存用户/用户配置文件时就是一个很好的例子。您可以将其用作参考。

      【讨论】:

      • 保存 SnUser (parent::save($con)) 时,还会在 db 中插入一条 SnAltceva 的记录(除了 user_id 字段)。如果我得到新的 id 然后设置并保存,我将有另一条记录正确填写 used_id 但其余字段没有值。我应该做的是更新现有的 SnAltceva 记录,或者在保存之前填充 user_id。我怀疑 SnUser 是先保存嵌入式表单,然后再保存主表单。而且我只有在保存主表单后才有 id。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多