cancel
Showing results for 
Search instead for 
Did you mean: 

Как добавить поле количества заказов?

SOLVED

Как добавить поле количества заказов?

Хочу сделать выборку клиентов у которых есть хотя бы 1 заказ. Специального фильтра в SearchCriteria не нашел для такого случая. Начал с того что написал примерный метод для фильтрации клиентов для customer collection. Вот он:

public function addCustomerCountOrdersToSelect()
{
    /*
    JOIN
    (
        SELECT customer_id, COUNT(entity_id) as count_orders
        FROM sales_order
        GROUP BY customer_id ASC
    ) orders ON orders.customer_id = customer_entity.entity_id
    */

    $orderTable = $this->_resource->getTableName('sales_order');

    $subquery = new \Zend_Db_Expr("
        (SELECT customer_id, COUNT(entity_id) as count_orders
        FROM $orderTable
        GROUP BY customer_id ASC)
    ");

    $this->getSelect()->join(['orders' => $subquery], 'orders.customer_id = e.entity_id');

    //$this->addExpressionAttributeToSelect('count_orders', 'SUM({{entity_id}})', 'entity_id');
}

Потом подумал что можно добавить extension_attributes включив в них результат этого метода. Не вышло. Что не получилось решить:

1. "Invalid attribute name". Не знаю как делать поиск по расширенным атрибутам.

2. В плагине для вставки значений в extension_attbitues не знаю как взять нужные данные из sql-запроса потому что у меня есть только CustomerEntity в котором кроме десятка методов по выборке стандартных данных ничего нет.

 

Пытаюсь понять как все же сделать так чтобы можно было запрашивать клиентов с заказами. Возможно, ставя условие на count_orders moreq 0. Возможно, есть более лучшие способы.

 

Как решить такую задачу?

2 REPLIES

Re: Как добавить поле количества заказов?

А отдельной, бухгалтерской проги нет? Я всю статистику оттуда просматриваю.

Re: Как добавить поле количества заказов?

После модерации сообщение появится, я думаю.

 

...

 

Нет, просто выборка клиентов с заказами. Сделал в итоге отдельным флагом includeOnlyWithOrders. Если true, то в в моем классе который переопределяет и наследует коллекцию клиентов, добавляется проверка:

 

public function getList(SearchCriteriaInterface $searchCriteria)
 ...
 if ($this->checkIncludeCustomersOnlyWithOrders()) {
   $collection->addCustomerCountOrdersToSelect();
 }
 ...
}

protected function checkIncludeCustomersOnlyWithOrders()
{
$includeOnlyWithOrders = $this->request->getQueryValue('includeOnlyWithOrders');

return ($includeOnlyWithOrders === 'true') ? true : false;
}

А в моем файле который переопределяет и наследует файл коллекции пользователей есть мой метод который добавляет условие к выборке клиентов.

public function addCustomerCountOrdersToSelect()
{
    /*
    JOIN
    (
        SELECT customer_id, COUNT(entity_id) as count_orders
        FROM sales_order
        GROUP BY customer_id ASC
    ) saleso ON saleso.customer_id = customer_entity.entity_id
    */

    $orderTable = $this->_resource->getTableName('sales_order');

    $subquery = new \Zend_Db_Expr("
        (SELECT customer_id, COUNT(entity_id) as count_orders
        FROM $orderTable
        GROUP BY customer_id ASC)
    ");

    $this->getSelect()->joinInner(['orders' => $subquery], 'orders.customer_id = e.entity_id');
}

Думаю что есть решения лучше с использованием встроенных атрибутов, например. Так же брать query-параметр в репозитории точно не хороший тон. Но что есть, то есть.