我有一对具有一对一关系的表。
我有一个投诉表格,需要在其中嵌入一个人员表格,相关架构如下:
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);
}
我找到了解决这个问题的方法。
重写表单类中的 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();
}
不幸的是,我在互联网上找不到任何有此解释的地方。 所以这是给那些追随我的人的。