0

我是一名 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 的一些内存内容,它不起作用。

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

谢谢,休斯。

4

2 回答 2

1

从 Magento 的角度来看,这些代码片段是相同的——你没有忘记 PHP 是如何工作的。使用默认 Magento 安装,所有 3 个片段必须产生相同的结果。

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

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

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

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

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

d) 检查在您的代码之后没有其他代码执行 - 可能其他模型或控制器修改了附加信息,因此删除了您的所有更改。尝试在您的代码之后插入“退出”,这样您就可以确定了。

于 2011-01-05T10:32:49.320 回答
0

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

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

于 2011-01-05T00:43:34.947 回答