【问题标题】:Retrieving single order in Magento by increment_id after editing an order with configurable products在使用可配置产品编辑订单后,通过 increment_id 在 Magento 中检索单个订单
【发布时间】:2011-08-14 19:27:34
【问题描述】:

我在一家主要销售可配置产品的 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。这个可以吗?

【问题讨论】:

    标签: php magento


    【解决方案1】:

    虽然 Mukesh 的回答在技术上可行,但如果您有一个请求返回的大型数据集,它可能会在加载整个集合时超时,这就是 getFirstItem() 函数的第一行所发生的情况。此处对此进行了概述:Top 3 Reasons to Avoid Magento's getFirstItem()

    【讨论】:

    • 按 increment_id 过滤希望永远不会提供大量集合!每个 increment_id 应该始终只有一个未取消的订单
    【解决方案2】:
    $order = Mage::getModel('sales/order')->loadByIncrementId($orderId);
    

    【讨论】:

      【解决方案3】:

      使用 getFirstItem()

      $orders = Mage::getModel('sales/order')
        ->getCollection()
        ->addAttributeToFilter('state', array('neq' => Mage_Sales_Model_Order::STATE_CANCELED))
        ->addAttributeToFilter('increment_id', 100000001)
        ->getFirstItem();
      

      【讨论】:

      • 我显然需要更密切地使用 RTFM。这是完美的,谢谢!
      猜你喜欢
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      相关资源
      最近更新 更多