我试图通过Magento学习编码,我不得不承认我对这种对象链的概念感到有点困惑。
事实上,我不明白何时进行加载以及什么时候可以避免它。例如:
$product = Mage::getModel('catalog/product')->load($item->getProductId());
我希望在这种情况下从产品ID获取产品信息;为什么我需要加载它? ($item
是订单的所有产品的循环)
在这里我不需要做任何负担:
$customer = $payment->getOrder()->getCustomer();
我很抱歉我的愚蠢问题:与第二个例子相比,加载做了什么?非常感谢,祝你有愉快的一天,
安塞尔姆
答案 0 :(得分:4)
在幕后,像$payment->getOrder()
这样的方法是有效的(在检查它是否已经加载之后)这样做:
return Mage::getModel('sales/order')->load($this->getOrderId());
// $this in this context is $payment
因此,仍然需要加载来从数据库中检索相关数据,getOrder()
方法只是一种方便。 load()
方法本身返回它的类实例,这就是为什么你可以在第一个例子中将它分配给$product
的原因。 getOrder()
和getCustomer()
方法不会自行返回,它们会返回不同的对象,这就是$payment
未分配给$customer
的原因你的第二个例子。
Mage::getModel()
方法仅负责确定正确的类并创建它的空白实例。您可以使用setData()
调用来设置数据,而不是加载,而是传递一个键控数组。所有的setter都返回它们的对象,就像load()
那样。
答案 1 :(得分:1)
$customer = $payment->getOrder()->getCustomer();
这意味着客户的ID已经存在于会话中,因此您无需明确告诉magento加载客户。
在产品案例中,您必须告诉magento您想要获取详细信息的产品的产品ID。