Хранить в двух таблицах в 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 через него?

Пожалуйста, просветите меня своими идеями и предложениями. Жду вашего ответа. Заранее благодарю

Author: Amit Bera, 2014-02-12

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. Вот и все.

До сих пор я не знаю, как использовать перед сохранением для этой цели. Если у меня есть намек на это, я обязательно внесу правку в этот ответ.

 1
Author: Rajeev K Tomy, 2014-02-13 08:59:19

Пожалуйста, используйте этот фрагмент кода:

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 );
    }
 1
Author: MageWorx, 2014-04-14 12:56:04