通过$ object-> save();保存对象属性问题

时间:2011-01-05 00:38:49

标签: php magento magento-1.4

我是一名magento程序员,我已经花了很长时间才弄清楚为什么对象上的属性没有保存在数据库中。

让我们解释一下,这里有3段我希望做同样事情的代码:

第一个代码

$order = Mage::getModel('sales/order')->load(1873);
$myInfo = 'important piece of information';
$order->getPayment()->setAdditionalInformation('my_info',$myInfo);
$order->getPayment()->save();  //No information in the database is saved

数据库中没有保存任何值。

第二个代码

$order = Mage::getModel('sales/order')->load(1873);
$myInfo = 'important piece of information';
$payment = $order->getPayment();
$payment->setAdditionalInformation('my_info',$myInfo);
$payment->save();  //No information in the database is saved

数据库中没有保存任何值。

第三代码

$order = Mage::getModel('sales/order')->load(1873);
$myInfo = 'important piece of information';
$order->getPayment()->setAdditionalInformation('my_info',$myInfo)->save();  //YEAHHH ! It works ! I now have that in my database.

最后,我明白了!

setAdditionalInformation

中的代码
   /**
     * Additional information setter
     * Updates data inside the 'additional_information' array
     * or all 'additional_information' if key is data array
     *
     * @param string|array $key
     * @param mixed $value
     * @return Mage_Payment_Model_Info
     * @throws Mage_Core_Exception
     */
    public function setAdditionalInformation($key, $value = null)
    {
        if (is_object($value)) {
            Mage::throwException(Mage::helper('sales')->__('Payment disallow storing objects.'));
        }
        $this->_initAdditionalInformation();
        if (is_array($key) && is_null($value)) {
            $this->_additionalInformation = $key;
        } else {
            $this->_additionalInformation[$key] = $value;
        }
        return $this->setData('additional_information', $this->_additionalInformation);
    }

注意:最终的setData()始终返回$ this

问题,为什么?

我想我已经忘记了PHP工作方式的一些特殊性,特别是对于第一个代码。我会理解它不起作用,因为PHP有​​一些内存。

但另外两段代码,为什么不起作用?

谢谢, 雨果。

2 个答案:

答案 0 :(得分:1)

这些代码段与Magento视图完全相同 - 您没有忘记PHP的工作原理。使用默认的Magento安装,所有3个片段必须产生相同的结果。

如果这些代码块的结果不同,那么您应该:

a)关闭您使用的所有自定义扩展程序,并在没有它们的情况下尝试使用代码块 - 也许某些扩展程序会修改订单或付款模式的默认行为。

b)检查你的代码片段是否与此问题中的代码片段完全相同 - 也许还有其他代码行被认为是非重要的,并且未包含在此问题中

c)检查您在执行每个代码段后更新MySQL客户端中的视图 - 也许您只看到付款表中的一些旧信息

c2)检查您是否使用了复制的MySQL服务器 - 也许您更新主数据库的信息,但是看到来自从数据库的支付表,这些更改尚未同步到

d)检查之后是否还没有其他代码执行 - 可能某些其他模型或控制器修改了additional_information,因此删除了所有更改。尝试在代码后面插入“退出”,这样你就可以确定了。

答案 1 :(得分:0)

不是Magento用户,但看起来好像每个方法都返回了链中下一个方法所需的对象。

如果单独调用每个方法,则他们创建或修改的对象将不包含先前方法调用所做的任何更改。通过链接方法调用,每个方法都会获取前一次调用所做的更改。