4

私はMagentoを初めて使用します。

指定された増分IDの注文がすでに存在するかどうかを確認する適切な方法は何ですか?

明白な方法:

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

新しい空のモデルインスタンスが返されるため、機能しません。

そのIDのそのようなモデルがないかどうかを確認するためのMagentoの正しい方法は何ですか?

4

3 に答える 3

14

私がコアコードで見た最も一般的なアプローチは、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データモデルにデータをロードする呼び出しは常にオブジェクトインスタンスを返すことに注意してください。オブジェクトがデータで装飾され、したがって主キーで装飾されるのは、ストレージバックエンドからの結果がある場合のみです。

于 2012-12-17T01:41:02.170 に答える
4

私の経験では、これを行うには2つの方法があります。

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");
}

コレクションはモデルのアフターロードメソッドをトリガーしないため、単純な「does / does-not」存在チェックの最後のアプローチを好みます。これは、理論的にはパフォーマンスが高いことを意味します。とは言うものの、他のアプローチよりも有効なアプローチはありません。より読みやすいコードを得るには、どこでも同じ手法を使用してみてください。

于 2012-12-17T01:09:54.750 に答える