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