Comment enregistrer les données de formulaire à plusieurs tables dans la base de données

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

  •  16-10-2019
  •  | 
  •  

Question

J'ai créé un formulaire dans le panneau d'administration avec différents domaines. Maintenant, les champs ici ne font pas partie d'une seule table. Sur la sauver, je veux des valeurs pour aller dans une table particulière tandis que d'autres pour aller dans une autre table. Je suis en mesure de présenter les données en utilisant des jointures, mais ne sais pas comment les enregistrer.

Le mot Let J'ai un tbluser avec des champs:

tbluser

- user_id        INT(11)         Auto Increment
- username       VARCHAR(15)
- store_id       SMALLINT(5)
- bank_id        INT(11)

Ici, store_id et bank_id ont des contraintes de clé étrangère id auto-augmentation de tblcore_store (id, store_name) et tblBanks (id, bank_name, bank_acc) respectivement. Maintenant, les champs du formulaire sont:

  • Nom d'utilisateur
  • Id magasin
  • Nom du magasin
  • Nom de la banque
  • compte bancaire

Quand cliquez admin je veux sauver les données de formulaire pour aller dans leurs tableaux et ayant également leurs références respectives dans store_id et bank_id.

Était-ce utile?

La solution

vous pouvez sélectionner une table principale (modèle et ressources - dans votre cas tbluser) qui fera toutes les opérations de sauvegarde. Ensuite, dans le contrôleur, vous devez définir toutes les données dans ce modèle et écrire votre propre fonction de _beforeSave qui sauvera tous les autres modèles dans d'autres tables, ajouter leur carte d'identité au modèle de table principale et puis enregistrez le modèle principal.

fonction _beforeSave doit être mis en œuvre dans le modèle des ressources de ce modèle. Modèle / ressources / fichier 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 );
}
...

Dans votre contrôleur, vous aurez juste à écrire:

$mainModel = Mage::getModel( 'moduleName/mainModel' );

if( $id ) {
    $mainModel->load( $id );
}

$mainModel->setData( $dataFromServerRequest ) // or addData...
    ->save();

et la fonction _beforeSave fera le reste.

Cela permettra d'économiser les données que vous souhaitez dans d'autres tables à d'autres tables tout en exécutant toujours toutes les requêtes dans la même transaction afin qu'ils soient enregistrés ou annulées tous ensemble.

Cette technique fonctionne parce que peu importe ce que vous ajoutez à un modèle avec setData sera conservée après appel à la fonction de sauvegarde (et surtout dans les fonctions _afterSave et _beforeSave), mais seulement les données qui ont le même nom qu'une colonne de table sera actualy être sauvé. Vous avez juste besoin de valeurs de nom d'autres tables différemment que les colonnes de la table du modèle actuel et vous n'aurez pas de problèmes d'accès à ces données en fonction _beforeSave et sauvegarde à d'autres tables.

Tout cela peut aussi se faire en _afterSave si vous avez besoin pour $ object-> getId () et de l'enregistrer à une table enfant (en _beforeSave l'objet $ n'a pas encore été enregistré si l'identifiant est présent seulement si cette entrée de table existait avant et a été chargé. d'autre part en _afterSave il a déjà été enregistré afin que vous puissiez l'utiliser est id unique là-bas).

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top