2011-04-28 76 views
6

我遇到了一個主要處理可配置產品銷售的Magento商店的一個有趣問題。我有一些代碼將訂單信息打包併發送到外部倉庫,然後完成訂單。有了這個請求,我使用increment_id作爲標識符。我們定期向倉庫詢問訂單是否已發貨,如果他們報告,我們會通過increment_id檢索Magento中的訂單,並通過創建新的貨件來完成訂單。在使用可配置產品編輯訂單後,通過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。這可以做到嗎?

回答

9

使用getFirstItem()

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

我顯然需要RTFM更密切一點。這是完美的,謝謝! – CVM 2011-04-28 15:19:29

6
$order = Mage::getModel('sales/order')->loadByIncrementId($orderId); 
1

雖然從穆克什答案將在技術上的工作,如果你有一個請求返回的大型數據集,這將有可能超時時加載整個集合,這是getFirstItem()函數的第一行發生的情況。這裏概述:Top 3 Reasons to Avoid Magento's getFirstItem()

+0

通過increment_id過濾希望永遠不會給大集合!每個increment_id應始終只有一個未取消訂單 – Josef 2015-01-27 15:23:02

相關問題