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

18.12.2014

Пример запроса, возвращающего пять товаров (не дисплеев) купленных с товаром 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
Похожие записи

Добавить комментарий