如何将表单数据保存到数据库中的多个表
题
我在管理面板中创建了一个具有各种字段的表单。现在,这里的字段不属于一个表。在保存上,我希望一些值进入一个特定的表,而另一些则可以进入其他表格。我能够使用加入显示数据,但不知道如何保存它们。
假设我有一个带有字段的tbluser:
tbluser
- user_id INT(11) Auto Increment
- username VARCHAR(15)
- store_id SMALLINT(5)
- bank_id INT(11)
在这里,store_id and bank_id对自动插入ID的外键约束 tblcore_store (id,store_name)和 tblbanks (id,bank_name,bank_acc)。现在形式的字段是:
- 用户名
- 存储ID
- 商店名称
- 银行名称
- 银行账户
当管理员单击“保存”时,我希望表单的数据进入其各自的表格,并在store_id and bank_id中使用其参考。
解决方案
您可以选择一个将执行所有保存操作的主表(模型和资源 - 在您的情况下)。然后,在控制器中,您应该在该模型中设置所有数据,并编写自己的_beforesave函数,以将所有其他模型保存到其他表中,将其ID添加到主表模型中,然后保存主模型。
_beforesave函数应在该模型的资源模型中实现。型号/资源/mainmodule.php文件:
...
// this function will get executed before the model is saved but after save function has been called
protected function _beforeSave( Mage_Core_Model_Abstract $object )
{
// do some model loads and checks here so that you will update existing data and not duplicate rows on editAction saves...
$otherModel = Mage::getModel( 'moduleName/otherTableModel' );
$otherModel->setData( 'foo', $object->getData( 'other_table_foo' ) )->save();
$object->setData( 'bank_id', $otherModel->getId() );
return parent::_beforeSave( $object );
}
...
在您的控制器中,您只需要写下:
$mainModel = Mage::getModel( 'moduleName/mainModel' );
if( $id ) {
$mainModel->load( $id );
}
$mainModel->setData( $dataFromServerRequest ) // or addData...
->save();
_BEFORESAVE函数将完成其余的工作。
这将使您想要在其他表中的数据保存到其他表中,同时仍在同一交易中执行所有查询,以便将它们保存或滚动在一起。
该技术之所以有效,是因为无论您在使用SETDATA的模型中添加什么模型,都将在呼叫后保存以保存函数(更重要的是在_aftersave和_beforesave函数内部),但是只有具有相同名称与表列的数据可以保存。您只需要与当前模型表中的列中的其他表命名值不同,并且在_beforesave函数中访问该数据并将其保存到其他表中,您就不会遇到任何问题。
如果您需要获取$ object-> getId()并将其保存到子表(在_beforesave中以前存在并加载。另一方面,它已经保存了,因此您可以在那里使用它的唯一ID)。