web-dev-qa-db-ja.com

コマースは注文から製品IDを取得します

私の質問は簡単です: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?
    }

うまくいけば、誰かがこの質問に答えることができます:)

12
user5706

コマース製品の参照フィールドの正確な構造を思い出せませんが、このようなことをする必要があります。

このコードスタイルは、ラインアイテムエンティティの内部キャッシュが使用するメモリが多すぎるため、多くの注文では機能しません。何千もの注文がある場合、これは問題になります。

$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']...
  }
}
9
googletorp

エンティティメタデータラッパーを使用すると、次のこともできます。

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であるためです。

22
Ryan Szrama

オブジェクト全体(ラインアイテム、注文、コマース製品)をロードする必要がない場合は、次のようなクエリを実行できます。

 $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;
3
tomas.teicher