我在集合中看到了一个意想不到的行为,也许有人可以启发我(或者可能是我不了解的一点 PHP)(抱歉这篇文章的长度,但我必须包含示例代码和结果)。
我的目标是编写一份报告,在其中获得订单及其订单商品,然后转到订单的发票和发货数据,并从他们的商品中获取匹配的订单商品数据。我知道所有订单只有一张发票和发货,所以即使 Magento 在订单和发票/发货之间使用 1-M 关系,我也可以像 1-1 一样利用它
我知道这些项目都是使用 order_item_id 字段相关的,所以我尝试编写一个使用以下调用的函数 -
$invoiceItem = $order
->getInvoiceCollection()
->getFirstItem()
->getItemsCollection()
->addFieldToFilter('order_item_id', $orderItem->getItemId())
->getFirstItem();
但这不是我预期的结果,我看到的是无论过滤器中使用的订单项目 ID 是什么,都返回了相同的发票项目。
因此,为了尝试理解问题,我编写了以下小程序来查看查询是如何创建的。
<?php
require dirname(__FILE__).'/../app/Mage.php';
umask(0);
Mage::app('default');
$orders = Mage::getResourceModel('sales/order_collection')
->addAttributeToSelect('*')
->addAttributeToFilter('state', 'processing')
->addAttributeToSort('created_at', 'desc')
->addAttributeToSort('status', 'asc')
->load();
foreach ($orders as $order) {
echo "\ngetting data for order id ". $order->getId();
$items = $order->getAllItems();
$invoice = $order->getInvoiceCollection()->getFirstItem();
foreach ($items as $orderItem) {
echo "\n\ngetting data for order item id ". $orderItem->getItemId();
$invoiceItems = $order
->getInvoiceCollection()
->getFirstItem()
->getItemsCollection()
->addFieldToFilter('order_item_id', $orderItem->getItemId());
echo "\n".$invoiceItems->getSelect();
}
die; //just quit after one iteration
}
该程序的输出如下 -
getting data for order id 7692
getting data for order item id 20870
SELECT `main_table`.* FROM `sales_flat_invoice_item` AS `main_table` WHERE (parent_id = '7623') AND (order_item_id = '20870')
getting data for order item id 20871
SELECT `main_table`.* FROM `sales_flat_invoice_item` AS `main_table` WHERE (parent_id = '7623') AND (order_item_id = '20870') AND (order_item_id = '20871')
getting data for order item id 20872
SELECT `main_table`.* FROM `sales_flat_invoice_item` AS `main_table` WHERE (parent_id = '7623') AND (order_item_id = '20870') AND (order_item_id = '20871') AND (order_item_id = '20872')
如您所见,每次通过循环时,都会为我过滤的每个项目 ID 添加另一个“AND(order_item_id =”。我认为每次通过循环,我都会从使用 $order->getInvoiceCollection()。
那么,谁能告诉我我的示例代码出了什么问题,并教育我正确的方法来做到这一点?
谢谢!