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 :)

user5706
quelle
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']...
  }
}
googletorp
quelle
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.

Ryan Szrama
quelle
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;
tomas.teicher
quelle
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