我在管理面板中创建了一个具有各种字段的表单。现在,这里的字段不属于一个表。在保存上,我希望一些值进入一个特定的表,而另一些则可以进入其他表格。我能够使用加入显示数据,但不知道如何保存它们。

假设我有一个带有字段的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)。

许可以下: CC-BY-SA归因
scroll top