我遇到了Magento商店的一个有趣问题,该商店主要销售可配置产品。我有一些代码可以打包订单信息并将其发送到外部仓库,然后外部仓库完成订单。有了这个请求,我使用increment_id
作为标识符。我们会定期向仓库询问订单是否已发货,如果订单已经发货,我们会通过increment_id
在Magento中检索订单,并通过针对订单创建新货件来完成订单。
现在,这可以正常工作,直到订单被编辑。由于Magento处理可配置产品,编辑订单涉及取消当前订单并使用相同的increment_id
重新创建它。随后,基于increment_id
的我的互动现在被打破了,因为当我做这样的事情时,似乎只检索到第一个(取消的)订单,因为increment_id
不再是唯一的:
<?php
$order = Mage::getModel('sales/order')->loadByIncrementId(100000001);
?>
通常情况下,重复increment_id
是不可能的,所以我原本期望Magento优先考虑“有效”订单,但事实并非如此。
现在,我找到了一种方法来解决这个问题:
<?php
$orders = Mage::getModel('sales/order')
->getCollection()
->addAttributeToFilter('state', array('neq' => Mage_Sales_Model_Order::STATE_CANCELED))
->addAttributeToFilter('increment_id', 100000001);
foreach ($orders as $order) {
// Do what we need with the order
}
?>
但是,我有兴趣知道是否有办法从集合中只取回一条记录,而不需要foreach
。可以这样做吗?
答案 0 :(得分:9)
使用 getFirstItem()
$orders = Mage::getModel('sales/order')
->getCollection()
->addAttributeToFilter('state', array('neq' => Mage_Sales_Model_Order::STATE_CANCELED))
->addAttributeToFilter('increment_id', 100000001)
->getFirstItem();
答案 1 :(得分:6)
$order = Mage::getModel('sales/order')->loadByIncrementId($orderId);
答案 2 :(得分:1)
虽然Mukesh的答案在技术上可行,但如果您有一个请求返回的大型数据集,则在加载整个集合时可能会超时,这是在getFirstItem()函数的第一行发生的情况。这在此概述:Top 3 Reasons to Avoid Magento's getFirstItem()