データベース内の複数のテーブルにフォームデータを保存する方法

magento.stackexchange https://magento.stackexchange.com/questions/436

  •  16-10-2019
  •  | 
  •  

質問

さまざまなフィールドを持つ管理パネルにフォームを作成しました。これで、ここのフィールドは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を使用できます)。

ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top