如何检查magento中是否已存在具有给定增量ID的订单?

时间:2012-12-16 23:02:09

标签: magento

我是Magento的新手。

检查具有给定增量ID的订单是否已存在的正确方法是什么?

显而易见的方式:

    $order = Mage::getModel('sales/order')->loadByIncrementId($reservedOrderId);
    if ($order) {
        Mage::log('already have order with id ' . $reservedOrderId);
        return $order;
    }

不起作用,因为我得到了一个新的空模型实例。

magento的正确方法是什么,看看我的id是否没有这样的模型?

3 个答案:

答案 0 :(得分:12)

我在核心代码中看到的最常见的方法是load()一个模型并检查是否分配了主键。在您的情况下,这将如下所示 - 请注意对逻辑条件($object->getId()$object)的轻微调整:

$order = Mage::getModel('sales/order')->loadByIncrementId($reservedOrderId);
if ($order->getId()) {
    Mage::log('already have order with id ' . $reservedOrderId);
    return $order;
}

这是一个简单的错误,但请记住在Magento数据模型上加载数据的调用将始终返回对象实例。只有如果存储后端的结果,对象将用数据装饰,因此是主键。

答案 1 :(得分:3)

根据我的经验,有两种方法可以做到这一点:

if ($order->hasData()) {
    // order already exists
}

或者,通过使用集合;

$collection = Mage::getModel('sales/order')->getCollection()->addFieldToFilter('increment_id', $reservedOrderId);

if ($collection->count()) {
    // order already exists
}

在您的情况下,最好使用第一个。

答案 2 :(得分:2)

有多种方法可以解决这个问题。首先,既然您知道了期望的增量ID,那么您可以在返回模型后进行检查

$increment_id   = '100000002';
$order          = Mage::getModel('sales/order')->loadByIncrementId($increment_id);

if($order->getIncrementId() == $increment_id)
{
    var_dump("Increment IDs match, that means there's an order");
}
else
{
    var_dump("Increment IDs don't match, that means there's no order");
}

同样,虽然即使没有匹配也会返回模型,但您可以检查模型的数据 - 空数组表示没有加载任何内容

$increment_id   = '100000002';
$order          = Mage::getModel('sales/order')->loadByIncrementId($increment_id);

if($order->getData())
{
    var_dump("Data array means there's an order");
}
else
{
    var_dump("Empty data array means there's no order");
}

最后,您可以使用增量ID过滤器加载集合,并检查它包含的项目数

$increment_id   =   '100000002';
$c              =   Mage::getModel('sales/order')->getCollection()
                    ->addFieldToFilter('increment_id',$increment_id);        
if(count($c) > 0)
{
    var_dump("A collection with more than zero items means the order exists");
}
else
{
    var_dump("An empty collection means it does not");
}

我更喜欢最后一种简单的“do / does-not”存在检查方法,因为集合不会触发模型的后加载方法,这意味着它在理论上更具性能。也就是说,没有一种方法比另一种方法更有效 - 只是尝试在任何地方使用相同的技术来获得更易读的代码。