Drupal → Посчитать число покупок товара

16.12.2014

Посчитать число покупок конкретного товара (не дисплея):

$product_id = 123;

$query = db_select('field_data_commerce_product', 'fcp');
$query->addExpression('COUNT(*)');
$query->innerJoin('commerce_line_item', 'l', 'l.line_item_id = fcp.entity_id');
$query->innerJoin('commerce_order', 'o', 'o.order_id = l.order_id');
$query->condition('o.status', 'completed');
$query->condition('fcp.commerce_product_product_id', $product_id);
$count = $query->execute()->fetchField();

Чтобы посчитать число покупок всех товаров одного дисплея можно обойти товары в цикле и сложить результат прошлого запроса, а можно добавить пару лишних джоинов:

$product_display_nid = 123;

$query = db_select('node', 'n');
$query->addExpression('COUNT(*)');
$query->innerJoin('field_data_field_product', 'ffp', 'ffp.entity_id = n.nid');
$query->innerJoin('field_data_commerce_product', 'fcp', 'fcp.commerce_product_product_id = ffp.field_product_product_id');
$query->innerJoin('commerce_line_item', 'l', 'l.line_item_id = fcp.entity_id');
$query->innerJoin('commerce_order', 'o', 'o.order_id = l.order_id');
$query->condition('o.status', 'completed');
$query->condition('n.nid', $product_display_nid);
$count = $query->execute()->fetchField();

Запросы актуальны для дефолтных названий полей:
$product_display->field_product
$line_item->commerce_product

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

Комментарии

Дмитрий
30.01.2018, 17:24

Спасибо, сэкономили мне время на написание запроса.

Дмитрий
30.01.2018, 19:29

Рано обрадовался. Приведенный запрос не считает количество заказанных товаров, а следовательно выдает не верные значения.

То есть, если в заказе скажем 5 штук какого либо товара, приведенный выше запрос посчитает только 1 шт. из этого заказа.

Дмитрий
30.01.2018, 20:24

Этот запрос считает с учётом количества заказанных товаров в заказе.

$product_id = 123;
 
$query = db_select('field_data_commerce_product', 'fcp');
$query->addExpression('SUM(l.quantity)');
$query->innerJoin('commerce_line_item', 'l', 'l.line_item_id = fcp.entity_id');
$query->innerJoin('commerce_order', 'o', 'o.order_id = l.order_id');
$query->condition('o.status', 'completed');
$query->condition('fcp.commerce_product_product_id', $product_id);
$count = $query->execute()->fetchField();

Нашёл еще один баг. В commerce могут быть "осиротевшие" line-items, которые были удалены из заказа, но фактически остались в БД. и их тоже посчитает вышеприведенный запрос. Что бы этого не происходило и в расчёт не брались эти "осиротевшие" line-items пользуемся этим запросом:

$product_id = 123;
 
$query = db_select('field_data_commerce_product', 'fcp');
$query->addExpression('SUM(l.quantity)');
$query->innerJoin('commerce_line_item', 'l', 'l.line_item_id = fcp.entity_id');
 $query->innerJoin('field_data_commerce_line_items', 'fdcli', 'fdcli.commerce_line_items_line_item_id = l.line_item_id');
$query->innerJoin('commerce_order', 'o', 'o.order_id = l.order_id');
$query->condition('o.status', 'completed');
$query->condition('fcp.commerce_product_product_id', $product_id);
$count = $query->execute()->fetchField();
Василий
17.10.2020, 20:58

Мне нужно вывести поле с количеством купленных товаров в самой ноде с дисплеем товара, только не понимаю куда Ваш запрос добавить?

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