商业从订单中获取产品ID


12

我的问题很简单:如何从具有Drupal代码的商业订单中获得产品ID?我现在有这样的事情:

  $orders = commerce_order_load_multiple(array(), array('status' => 'pending'), TRUE);
  foreach($orders as $order) {
    foreach ($order->commerce_line_items['und'] as $line) {
        $line_id = $line['line_item_id'];
        // ... product id, where are you?
    }

希望有人能够回答这个问题:)


您是否尝试过var_dump($ order); 在您的第二个foreach中?
saadlulu 2012年

Answers:


9

我不记得商务产品参考字段的确切结构,但是您需要执行以下操作。

警告此代码样式不适用于许多订单,因为订单项实体的内部缓存会占用太多内存。如果您有数千个订单,这将是一个问题。

$orders = commerce_order_load_multiple(array(), array('status' => 'pending'), TRUE);
foreach($orders as $order) {
  foreach ($order->commerce_line_items['und'] as $line) {
    $line_item = commerce_line_item_load($line['line_item_id']);
    $product_id = $line_item->commerce_product['und']...
  }
}

谢谢,这有效。我想到在商务表上运行查询也是一种选择。有一个关系订单-可以使用sku字段建立产​​品。
user5706

我也是。遗憾的是,当我拥有订单ID时,我不能仅查询产品IDS,而是必须加载这么多对象。
tomas.teicher 2013年

直接使用“ und”不是一个好习惯。如果确定您的代码仅会在未翻译的站点上使用,则可以使用LANGUAGE_NONE常数-但最好的做法是使用field_get_items()从字段中获取项目,然后进行迭代。因此foreach ($order->commerce_line_items['und'] as $line) { ... }成为$items = field_get_items('commerce_order', $order, 'commerce_line_items'); foreach ($items as $line) { ... }等等。或者,使用entity_metadata_wrapper,它会自动考虑语言。
金安迪

22

使用实体元数据包装器,您还可以执行以下操作:

foreach (commerce_order_load_multiple(array(), array('status' => 'pending'), TRUE) as $order) {
  $product_ids = array();
  foreach (entity_metadata_wrapper('commerce_order', $order)->commerce_line_items as $delta => $line_item_wrapper) {
    if (in_array($line_item_wrapper->type->value(), commerce_product_line_item_types())) {
      $product_ids[] = $line_item_wrapper->commerce_product->raw();
    }
  }
}

此处的重要部分是检查订单项的类型,因此您最终不会在产品ID列表中包括运输订单项或其他类型的订单项。此外,在包装器通知下,我在订单项上使用了commerce_product字段的“原始”值。这是因为“值”是完全加载的参考产品,而“原始”值只是产品ID。


3

如果您不需要加载整个对象(订单项,订单和商业产品),则可以运行以下查询:

 $args = array(
    ':order_id' => $order_id,

);
$product_ids = db_query("SELECT p.commerce_product_product_id 
   FROM {commerce_line_item} li 
   JOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id) 
   WHERE li.order_id = :order_id AND li.type = 'product'", $args)->fetchCol();
return $product_ids;

将数据映射到DB可能是一个艰巨的任务。.感谢您提供的映射信息..自2天以来一直在搜索
mjs

从理论上讲,其他实体类型可以使用commerce_product字段,因此Join应该更合适JOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')
-KingAndy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.