Как сохранить данные формы в несколько таблиц в базе данных
Вопрос
Я создал форму на панели администратора с различными полями. Теперь поля здесь не принадлежат к одной таблице. При сохранении я хочу, чтобы некоторые значения перешли в одну конкретную таблицу, в то время как другие, чтобы войти в какую -то другую таблицу. Я могу показать данные, используя соединения, но не знаю, как их сохранить.
Допустим, у меня есть 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 он уже сохранен, так что вы можете использовать его уникальный идентификатор).