Magento foreach()命令getAllItems()

时间:2012-11-07 19:35:59

标签: magento foreach

我不确定为什么这个循环不起作用。

    $orders = Mage::getSingleton('sales/order')->getCollection()  
        ->addAttributeToSelect('*')  
        ->addFieldToFilter('created_at', array('from'=>$from, 'to'=>$to)) 
        ->addAttributeToSort('increment_id', 'ASC')
        ;

    foreach ($orders as $item) { 
        $order_id = $item->increment_id;
        if (is_numeric($order_id)) $order = Mage::getModel('sales/order')->loadByIncrementId($order_id);
        if (is_object($order)) {
            echo "> O: ". $order_id ."<BR>";
            $items = $order->getAllItems();
            echo ">> O: ". $order_id ."<BR>";
        } else
            die("DIE ". var_dump($order));  
    }
die("<BR> DONE");

输出:

...
...
>> O: 100021819
> O: 100021820
>> O: 100021820
> O: 100021821

循环永远不会完成,也不会停在相同的order_id。?

$ order-&gt; getAllItems()

总是失败

这些订单待定,处理或完成。

我应该用$ order-&gt; getAllItems()检查一下,因为那是失败的。

感谢。

2 个答案:

答案 0 :(得分:1)

乔恩,我认为你所谈论的问题是你的剧本预期结束。即,您会看到一个>

的输出
> O: 100021821

但不是双>>的输出。

由于Magento是如此可定制的,因此无法根据给出的信息准确诊断您的问题。您的系统中发生了某些事情(PHP错误,未捕获的异常等),导致脚本停止。打开开发人员模式并将PHP ini display_errors设置为1(ini_set('display_errors', 1);)并检查错误日志。一个你(或我们)有PHP错误,帮助你会更容易。

我的猜测是你遇到了内存问题。 PHP实现对象的方式可能导致小内存泄漏 - 对象无法正确清理。这意味着每次进行循环时,您都会慢慢消耗PHP请求允许的总内存量。对于拥有大量订单的系统,如果上述代码在内存不足之前可以通过所有内容,我会感到惊讶。

如果您的问题是内存问题,则有关于PHP对象in this PDF之后手动清理的信息。您还应该考虑将您的操作拆分为多个请求。即第一个请求处理订单1 - 100,下一个101 - 200,等等。

答案 1 :(得分:0)

你是什么意思失败了? 通过输出的外观,它不会在那里失败,因为它在调用getAllItems()的任一侧输出文本

变化:

$items = $order->getAllItems();

为:

foreach($order->getAllItems() as $orderItem) {
    echo $orderItem->getId() . "<br />";
}

看看会发生什么。

如果您在服务器上设置了较低的内存限制,并且在资源不足时退出,则脚本每次都可能以不同的订单ID结束。