データベース内の複数のテーブルにフォームデータを保存する方法
質問
さまざまなフィールドを持つ管理パネルにフォームを作成しました。これで、ここのフィールドは1つのテーブルに属していません。セーブでは、特定のテーブルにいくつかの値を移動し、他の値が他のテーブルに入るようにしたいです。結合を使用してデータを表示することができますが、それらを保存する方法がわかりません。
私はフィールドを持つtbluserを持っているとしましょう:
tbluser
- user_id INT(11) Auto Increment
- username VARCHAR(15)
- store_id SMALLINT(5)
- bank_id INT(11)
ここで、store_idとbank_idには、自動インクリメントIDの外部キーの制約があります tblcore_store (id、store_name)and tblbanks (id、bank_name、bank_acc)それぞれ。今、形のフィールドは次のとおりです。
- ユーザー名
- IDを保存します
- 店名
- 銀行名
- 銀行口座
管理者をクリックしたときに保存します。フォームのデータをそれぞれのテーブルに移動し、Store_idとbank_idで参照を持っています。
解決
すべての保存操作を実行するメインテーブル(モデルとリソース - Tbluser)を選択できます。次に、コントローラーで、そのモデルのすべてのデータを設定し、他のすべてのモデルを他のテーブルに保存し、メインテーブルモデルにIDを追加してメインモデルを保存する独自の_foresave関数を記述する必要があります。
_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()を取得し、子テーブルに保存する必要がある場合は_aftersaveでも実行できます(_beforesave $ objectはまだ保存されていないため、そのテーブルエントリの場合にのみIDが存在します一方、_aftersaveではすでに保存されているので、そこで一意のIDを使用できます)。