保存嵌入式 Propel symfony 表单以实现一对一关系

问题描述 投票:0回答:1

我有一对具有一对一关系的表。

我有一个投诉表格,需要在其中嵌入一个人员表格,相关架构如下:

  complaint:
    id:                            ~
    created_at:                    ~
    updated_at:                    ~
    complainant_id:                { type: integer, foreignTable: person_data, foreignReference: id, onDelete: setnull }
    status:                        { type: tinyint, default: 1 }
    complaint_title:               { type: varchar(64) } 
    complaint_number:              { type: varchar(16) } 
    recipient:                     { type: varchar(128) }

  person_data:
    id:                            ~
    created_at:                    ~
    updated_at:                    ~
    company_name:                  { type: varchar(64) }
    first_name:                    { type: varchar(64) }
    last_name:                     { type: varchar(64) }
    email:                         { type: varchar(128) }

我能够成功地将两个对象保存到数据库,但主要投诉对象未使用 person_data 行的投诉 ID 进行更新。

有谁知道为什么这不能正常工作以及如何强制它正确更新投诉对象?

我使用的是 symfony 1.4.13,Propel 1.6.3。

更新:

这是嵌入表单的代码:

<?php
    public function configure()
    {
        $use_fields = array();

        // ...other fields added...


        $sub_form   = new PersonDataForm(array(), array());
        $this->embedForm('complainant', $sub_form);
        array_push($use_fields, 'complainant');

        $this->useFields($use_fields);
    }
php forms symfony1 propel
1个回答
0
投票

我找到了解决这个问题的方法。

重写表单类中的 saveEmbeddedForms 方法。

更新主对象发生在保存嵌入表单之后,因此 ids 可用于更新主对象。

public function saveEmbeddedForms($con = null, $forms = null) 
{

    // save the embedded forms
    parent::saveEmbeddedForms($con, $forms);

    // loop through all embedded forms and update the main object with their ids
    foreach($this->getEmbeddedForms() as $name => $embedded_form)
    {
        switch($name)
        {
            case 'recipient':
                // criteria to determine if the sub-object should be saved or not
                if($embedded_form->getObject()->getFirstName() == '' && $embedded_form->getObject()->getLastName() == '')
                {
                    $embedded_form->getObject()->delete();
                    $this->getObject()->setRecipientId(null);
                    $this->getObject()->save();
                }
                else
                    $this->getObject()->setRecipientId($embedded_form->getObject()->getId());
                break;
            case 'complainant':
                if($embedded_form->getObject()->getFirstName() == '' && $embedded_form->getObject()->getLastName() == '')
                {
                    $embedded_form->getObject()->delete();
                    $this->getObject()->setComplainantId(null);
                    $this->getObject()->save();
                }
                else
                {
                    $this->getObject()->setComplainantId($embedded_form->getObject()->getId());
                }
                break;
            default:
                break;
        }
    }

    // save the main object with the new sub-object keys set
    $this->getObject()->save();         
}

不幸的是,我在互联网上找不到任何有此解释的地方。 所以这是给那些追随我的人的。

© www.soinside.com 2019 - 2024. All rights reserved.