Хранить в двух таблицах в magento
У меня есть пользовательский модуль, который использует две таблицы для хранения данных в базе данных. таблица 1 и таблица 2 соединяются путем сохранения идентификатора таблицы 1 в одном из полей таблицы 2. Для хранения данных в таблице 2 я использую защищенную функцию _aftersave(). Вот мой метод последующего сохранения
// this function will get executed before the model is saved but after save function has been called
protected function _afterSave( 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...\
$frontendModel = Mage::getModel( 'news/newsfrontend' );
//loading item in table2 with current table1 id
$frontendCollection=$frontendModel->getCollection()
->addFieldToFilter('news_parent_id', array('eq' => $object->getId()))
->getLastItem();
if(!$frontendCollection->isEmpty()) //check whether any item exist or not
{
//saving news data to existing item
$frontendCollection->setData("news_parent_id",$object->getId())->save();
$frontendCollection->setData($object->getData())->save();
}
else
{
//storing new datas to new item
$frontendModel->setData("news_parent_id",$object->getId())->save();
$frontendModel->setData($object->getData())->save();
}
return parent::_beforeSave( $object );
}
Проблема, с которой я сейчас сталкиваюсь, заключается в
1) news_parent_id
не устанавливается после действия сохранения. Остальные данные сохраняются
в таблице 2
2) Правильно ли это подход к моей проблеме?
3) Как я могу правильно установить news_parent_id
?
4) Есть ли какой-нибудь простой способ добиться этого?
5) если я использую _beforesave()
, как я могу получить идентификатор table1, чтобы установить news_parent_id
через него?
Пожалуйста, просветите меня своими идеями и предложениями. Жду вашего ответа. Заранее благодарю
2 answers
Похоже, мне нужно ответить на свой собственный вопрос. На самом деле, это совсем не сложно. Потому что я близок к реальному ответу. Вот мой "рабочий" метод _aftersave()
. Взгляните
protected function _afterSave( 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...\
$frontendModel = Mage::getModel( 'news/newsfrontend' );
$frontendCollection=$frontendModel->getCollection()->addFieldToFilter('news_parent_id', array('eq' => $object->getId()))->getFirstItem();
if(!$frontendCollection->isEmpty())
{
$frontendCollection->addData($object->getData())->save();
}
else
{
$frontendModel->setData($object->getData());
$frontendModel->setData("news_parent_id",$object->getId());
$frontendModel->save();
}
return parent::_afterSave( $object );
}
$ объект содержит мои опубликованные данные, которые на самом деле ссылаются на базовую таблицу, я думаю. Я загружаю свою таблицу2 с помощью _getModel_method. Если условие проверяет, есть ли уже запись в таблице 2, соответствующая элементу в таблице 1. Если да, он обновит это поле, в противном случае он установит новый элемент в таблице 2. Вот и все.
До сих пор я не знаю, как использовать перед сохранением для этой цели. Если у меня есть намек на это, я обязательно внесу правку в этот ответ.
Пожалуйста, используйте этот фрагмент кода:
protected function _afterSave( 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...\
$frontendModel = Mage::getModel( 'news/newsfrontend' )->load($object->getId(), 'news_parent_id');
$data = $object->getData();
unset($data['id']);
if($frontendModel->getId())
{
// use addData() instead of setData() to retain news_parent_id field
$frontendModel->addData($object->getData())
->save();
}
else
{
$frontendModel->unsetData();
$frontendModel->setData($object->getData())
->save();
}
return parent::_afterSave( $object );
}