4

我是 Magento 的新手。

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

显而易见的方式:

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

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

magento 中查看我是否没有该 id 的此类模型的正确方法是什么?

4

3 回答 3

14

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

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

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

于 2012-12-17T01:41:02.170 回答
4

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

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

或者,通过使用集合;

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

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

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

于 2012-12-17T01:05:31.477 回答
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");
}

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

于 2012-12-17T01:09:54.750 回答