Как сохранить данные формы в несколько таблиц в базе данных

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

  •  16-10-2019
  •  | 
  •  

Вопрос

Я создал форму на панели администратора с различными полями. Теперь поля здесь не принадлежат к одной таблице. При сохранении я хочу, чтобы некоторые значения перешли в одну конкретную таблицу, в то время как другие, чтобы войти в какую -то другую таблицу. Я могу показать данные, используя соединения, но не знаю, как их сохранить.

Допустим, у меня есть Tbluser с полями:

Tbluser

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

Здесь Store_id и Bank_id имеют ограничения иностранного ключа для идентификаторов автоматического ввода tblcore_store (id, store_name) и tblbanks (id, bank_name, bank_acc) соответственно. Теперь поля в форме:

  • Имя пользователя
  • Идентификатор магазина
  • Название магазина
  • Название банка
  • Банковский счет

Когда администратор нажмите «Сохранить». Я хочу, чтобы данные формы переходили в свои соответствующие таблицы, а также имели свои ссылки в store_id и bank_id.

Это было полезно?

Решение

Вы можете выбрать основную таблицу (модель и ресурс - в вашем случае TBLUSER), которая будет выполнять все операции сохранения. Затем в контроллере вы должны установить все данные в этой модели и написать свою собственную функцию _beforeSave, которая сохранит все другие модели в другие таблицы, добавьте свои идентификаторы в основную модель таблицы, а затем сохраните основную модель.

_beforeSave Функция должна быть реализована в модели ресурса этой модели. Model/Resource/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 и сохранения их в других таблицах.

Все это также может быть сделано в _aftersave, если вам нужно получить $ object-> getId () и сохранить его в детском таблице (в _beforeSave объект $ еще не сохранен, поэтому идентификатор присутствует только в том случае существовал ранее и был загружен. С другой стороны, в _aftersave он уже сохранен, так что вы можете использовать его уникальный идентификатор).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top