Commerce получить идентификаторы товара из заказа


12

Мой вопрос прост: как мне получить идентификаторы продукта из коммерческого заказа с кодом Drupal? У меня сейчас что-то вроде этого:

  $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 продукта, но мне нужно загружать столько объектов.
— 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, который автоматически учитывает языки.
— KingAndy

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

Важной частью здесь является проверка типа позиции, поэтому вы не должны включать позиции отгрузки или другие типы позиций в свой список идентификаторов продуктов. Кроме того, заметив, что я использовал «сырое» значение поля commerce_product в позиции. Это связано с тем, что «value» будет полностью загруженным ссылочным продуктом, а «raw» - просто идентификатором продукта.


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;

сопоставление данных с БД может быть довольно сложной задачей .. спасибо за эту информацию сопоставления .. искал это с 2 дня
— mjs

Теоретически, другие типы сущностей могут использовать поле commerce_product, поэтому более подходящим будет соединениеJOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')
— KingAndy
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.