コマースは注文から製品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);を試しましたか?あなたの2番目のforeachの中に?
saadlulu

回答:


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がある場合、製品IDを照会することはできませんが、非常に多くのオブジェクトをロードする必要があります。
tomas.teicher

'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フィールドの「raw」値を使用したことに注意してください。これは、「値」が完全にロードされた参照製品であり、「未加工」値が単に製品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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.