xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Программно получить товары для блока "С этим товаром покупают"

Опубликовано в

Пример запроса, возвращающего пять товаров (не дисплеев) купленных с товаром 123 и отсортированных по популярности (числу продаж):

$product_id = 123;
$result = db_query("
  SELECT p.product_id, COUNT(*) cnt
  FROM {commerce_order} o
 
  /* Join line items */
  INNER JOIN {commerce_line_item} l1 ON l1.order_id = o.order_id
  INNER JOIN {commerce_line_item} l2 ON l2.order_id = o.order_id
 
  /* Join field data from line_item->commerce_product */
  INNER JOIN {field_data_commerce_product} lcp1 ON lcp1.entity_id = l1.line_item_id
  INNER JOIN {field_data_commerce_product} lcp2 ON lcp2.entity_id = l2.line_item_id
 
  /* Join products */
  INNER JOIN {commerce_product} p ON p.product_id = lcp2.commerce_product_product_id
 
  WHERE
    o.status = 'completed' AND
    p.status = 1 AND
    lcp1.commerce_product_product_id <> lcp2.commerce_product_product_id AND
    lcp1.commerce_product_product_id = :product_id
  GROUP BY p.product_id
  ORDER BY cnt DESC
  LIMIT 5
", array(':product_id' => $product_id))->fetchAllKeyed();

В $result будет массив где ключ - это id товара, а значение - число покупок вместе с товаром $product_id.

Пример запроса, возвращающего пять товар-дисплеев купленных с товарами в дисплее 123 и отсортированных по популярности (числу продаж):

$product_display_nid = 123;
$result = db_query("
  SELECT n.nid, COUNT(*) cnt
  FROM {commerce_order} o
 
  /* Join line items */
  INNER JOIN {commerce_line_item} l1 ON l1.order_id = o.order_id
  INNER JOIN {commerce_line_item} l2 ON l2.order_id = o.order_id
 
  /* Join field data from line_item->commerce_product */
  INNER JOIN {field_data_commerce_product} lcp1 ON lcp1.entity_id = l1.line_item_id
  INNER JOIN {field_data_commerce_product} lcp2 ON lcp2.entity_id = l2.line_item_id
 
  /* Join field data from product_display->field_product */
  INNER JOIN {field_data_field_product} nfp1 ON nfp1.field_product_product_id = lcp1.commerce_product_product_id
  INNER JOIN {field_data_field_product} nfp2 ON nfp2.field_product_product_id = lcp2.commerce_product_product_id
 
  /* Join product displays */
  INNER JOIN {node} n ON n.nid = nfp2.entity_id
 
  WHERE
    o.status = 'completed' AND
    n.status = 1 AND
    nfp1.entity_id <> nfp2.entity_id AND
    nfp1.entity_id = :nid
  GROUP BY n.nid
  ORDER BY cnt DESC
  LIMIT 5
", array(':nid' => $product_display_nid))->fetchAllKeyed();

В $result будет массив где ключ - это nid товар-дисплея, а значение - число покупок вместе с товар-дисплеем $product_display_nid.

Вообще полная цепочка связи товар-дисплея с заказом выглядит следующим образом:

node ->
field_data_field_product ->
commerce_product ->
field_data_commerce_product ->
commerce_line_item ->
field_data_commerce_line_items ->
commerce_order

но благодаря избыточности можно добраться быстрее:

node ->
field_data_field_product ->
field_data_commerce_product ->
commerce_line_item ->
commerce_order

Адский вариант с Views.

Написанное актуально для Commerce 1
Похожие записи

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании