Commerce mendapatkan id produk dari pesanan

12

Pertanyaan saya sederhana: Bagaimana cara mendapatkan id produk dari pesanan perdagangan dengan kode Drupal? Saya punya sesuatu seperti ini saat ini:

  $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?
    }

Semoga ada yang bisa menjawab pertanyaan ini :)

pengguna5706
sumber
Sudahkah Anda mencoba var_dump ($ order); di dalam foreach ke-2 Anda?
saadlulu

Jawaban:

9

Saya tidak ingat struktur persis bidang referensi produk perdagangan, tetapi Anda perlu melakukan sesuatu seperti ini.

Peringatan gaya kode ini tidak akan berfungsi pada banyak pesanan karena cache internal untuk entitas item baris akan menggunakan terlalu banyak memori. Ini akan menjadi masalah jika Anda memiliki ribuan pesanan.

$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']...
  }
}
googletorp
sumber
Terima kasih, ini berhasil. Saya mendapat ide bahwa menjalankan kueri di tabel perdagangan juga merupakan opsi. Ada pesanan hubungan - produk bisa dibuat dengan bidang sku.
user5706
Saya juga. Sayang sekali ketika saya memiliki ID pesanan, saya tidak bisa hanya menanyakan IDS produk, tetapi saya harus memuat begitu banyak objek.
tomas.teicher
Ini bukan praktik yang bagus untuk menggunakan 'und' secara langsung. Jika Anda yakin kode Anda hanya akan digunakan pada situs yang tidak diterjemahkan, Anda dapat menggunakan konstanta LANGUAGE_NONE - tetapi lebih baik digunakan field_get_items()untuk mendapatkan item dari bidang, dan alih-alih lakukan itu. Jadi foreach ($order->commerce_line_items['und'] as $line) { ... }menjadi $items = field_get_items('commerce_order', $order, 'commerce_line_items'); foreach ($items as $line) { ... }, dll. Atau, gunakan entitas_metadata_wrapper, yang secara otomatis memperhitungkan bahasa.
KingAndy
22

Menggunakan pembungkus metadata entitas, Anda juga bisa melakukan:

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();
    }
  }
}

Bagian penting di sini adalah memeriksa jenis item baris, sehingga Anda tidak berakhir termasuk item pengiriman baris atau jenis item baris lainnya dalam daftar ID produk Anda. Selain itu, dengan pemberitahuan wrapper bahwa saya menggunakan nilai "mentah" dari bidang commerce_produk pada item baris. Ini karena "nilai" akan menjadi produk referensi yang dimuat penuh, sedangkan nilai "mentah" hanyalah ID produk.

Ryan Szrama
sumber
3

Jika Anda tidak perlu memuat seluruh objek (item baris, pesanan, dan produk perdagangan) Anda dapat menjalankan kueri seperti ini:

 $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;
tomas.teicher
sumber
memetakan data ke DB bisa menjadi tugas yang cukup menakutkan .. terima kasih untuk info pemetaan ini .. telah mencari ini sejak 2 hari
mjs
Secara teori, tipe entitas lainnya dapat menggunakan bidang commerce_product, sehingga Gabung akan lebih tepatJOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')
KingAndy