Commerce erhält die Produkt-IDs von der Bestellung


12

Meine Frage ist einfach: Wie erhalte ich die Produkt-IDs aus einer Handelsbestellung mit Drupal-Code? Ich habe im Moment so etwas:

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

Hoffentlich kann jemand diese Frage beantworten :)


Haben Sie versucht, var_dump ($ order); in deinem 2. foreach?
— Saadlulu

Antworten:


9

Ich kann mich nicht an die genaue Struktur des Commerce-Produktreferenzfelds erinnern, aber Sie müssen so etwas tun.

Warnung: Dieser Codestil funktioniert bei vielen Aufträgen nicht, da der interne Cache für die Werbebuchungsentitäten zu viel Speicher belegt. Dies ist ein Problem, wenn Sie Tausende von Bestellungen haben.

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

Danke, das funktioniert. Ich hatte die Idee, dass das Ausführen einer Abfrage für die Commerce-Tabellen ebenfalls eine Option war. Dort könnte ein Beziehungsauftragsprodukt mit dem SKU-Feld eingerichtet worden sein.
— User5706

Ich auch. Schade, dass ich bei einer Auftrags-ID nicht nur Produkt-IDs abfragen kann, sondern auch so viele Objekte laden muss.
— tomas.teicher

Es ist keine gute Übung, 'und' direkt zu verwenden. Wenn Sie sicher sind, dass Ihr Code nur auf einer nicht übersetzten Site verwendet wird, können Sie die LANGUAGE_NONE-Konstante verwenden. Es wird jedoch empfohlen field_get_items(), die Elemente aus dem Feld abzurufen und stattdessen zu wiederholen. So foreach ($order->commerce_line_items['und'] as $line) { ... }wird $items = field_get_items('commerce_order', $order, 'commerce_line_items'); foreach ($items as $line) { ... }usw. Oder verwenden Sie entity_metadata_wrapper, der Sprachen automatisch berücksichtigt.
— KingAndy

22

Mit dem Entity Metadata Wrapper können Sie auch Folgendes tun:

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

Der wichtige Teil hier ist die Überprüfung des Typs der Werbebuchung, damit Sie keine Versandwerbebuchungen oder andere Arten von Werbebuchungen in Ihre Liste der Produkt-IDs aufnehmen. Außerdem wurde mit dem Wrapper darauf hingewiesen, dass ich den Rohwert des Felds commerce_product für die Werbebuchung verwendet habe. Dies liegt daran, dass der "Wert" das vollständig geladene Produkt ist, auf das verwiesen wird, während der "Rohwert" einfach die Produkt-ID ist.


3

Wenn Sie keine ganzen Objekte (Werbebuchungen, Bestellungen und Handelsprodukte) laden müssen, können Sie die Abfrage folgendermaßen ausführen:

 $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;

die Daten an die DB Abbildung als eine schwierige Aufgabe sein kann .. Danke für diese Zuordnung info .. haben diese seit 2 Tagen gesucht
— MJS

Theoretisch könnten andere Entitätstypen das Feld commerce_product verwenden, daher wäre der Join geeigneterJOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')
— KingAndy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.