Magento-“;created_ at”;字段不会随其余数据自动设置


Magento - "created_at" field does not set automatically with the rest of the data

我创建了一个模块,它将一些数据保存到自定义表中。这两个表中都有"created_at"answers"updated_at"字段。但是,当我将数据保存到这些表中时,"created_at"字段不会自动设置。

这是我的代码:Sql脚本:

->addColumn(
    'created_at', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array('nullable' => true,), 'Created At'
)
->addColumn(
    'updated_at', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array('nullable' => true,), 'Updated At'
)

Model.php

class my_Module extends Mage_Core_Model_Abstract
{
        public function addMyList($customerId, $name)
        {
            $this->setData(
                array(
                    'b2b_customer_id' => $customerId,
                    'name' => $name,
                )
            );
            $this->save();
            return;
        }
}

我看过其他帖子,但大多数帖子都将这个"created_at"文件与函数中的其他数据一起设置。这不是我想要的,因为我认为马根托应该自己处理。

但如果我想错了,或者代码不知怎么错了,请告诉我。

好吧,Magento在某些方面非常特别。自动设置created_atupdated_at是个好主意——大多数现代框架,例如Laravel,都支持这一点。

Magento不会自动设置created_atupdated_at

有一个Mage_Sales_Model_Resource_Abstract::_prepareDataForSave()方法,所以如果您有一个资源模型,并且它扩展了这个类,那么您可以/应该调用这个方法来正确设置created_atupdated_at

/**
 * Prepare data for save
 *
 * @param Mage_Core_Model_Abstract $object
 * @return array
 */
protected function _prepareDataForSave(Mage_Core_Model_Abstract $object)
{
    $currentTime = Varien_Date::now();
    if ((!$object->getId() || $object->isObjectNew()) && !$object->getCreatedAt()) {
        $object->setCreatedAt($currentTime);
    }
    $object->setUpdatedAt($currentTime);
    $data = parent::_prepareDataForSave($object);
    return $data;
}

如果需要,您仍然可以手动设置它。

在模型Mynamespace_mymodule_model_Mymodel中,只需添加_beforeSave()函数。

Mynamespace_mymodule_model_Mymodel extends Mage_Core_Model_Abstract
{ 
    public function _construct()
    {
        $this->_init('mynamespace_mymodule/myname');
    }
    protected function _beforeSave()
    {
        parent::_beforeSave();
        $now = Mage::getSingleton('core/date')->gmtDate();
        if ($this->isObjectNew()) {
            $this->setCreatedAt($now);
        }
        return $this;
    }
}