Правильно создать create в базе данных с полем type

Проблема в том что не работает статистика по промокодам и купонам. Вот код где выводиться статистика.:

protected function redeemed_codes() {

        $total = ['discount_codes' => 0, 'redeemable_codes' => 0];

        $chart = [];
        $result = database()->query("SELECT `type`, COUNT(`type`) AS `total`, DATE_FORMAT(`datetime`, '{$this->datetime['query_date_format']}') AS `formatted_date` FROM `redeemed_codes` WHERE `datetime` BETWEEN '{$this->datetime['query_start_date']}' AND '{$this->datetime['query_end_date']}' GROUP BY `formatted_date`, `type`");
        while($row = $result->fetch_object()) {
            $row->formatted_date = $this->datetime['process']($row->formatted_date);

            if(isset($chart[$row->formatted_date])) {
                $chart[$row->formatted_date] = [
                    'discount' => $row->type == 'discount' ? $chart[$row->formatted_date]['discount'] + $row->total : $chart[$row->formatted_date]['discount'],
                    'redeemable' => $row->type == 'redeemable' ? $chart[$row->formatted_date]['redeemable'] + $row->total : $chart[$row->formatted_date]['redeemable'],
                ];
            } else {
                $chart[$row->formatted_date] = [
                    'discount' => $row->type == 'discount' ? $row->total : 0,
                    'redeemable' => $row->type == 'redeemable' ? $row->total : 0,
                ];
            }

            $total['discount_codes'] += $row->type == 'discount' ? $row->total : 0;
            $total['redeemable_codes'] += $row->type == 'redeemable' ? $row->total : 0;
        }

        $chart = get_chart_data($chart);

        return [
            'total' => $total,
            'chart' => $chart,
        ];

    }
  1. Цикл while проходит по каждой строке результата запроса и извлекает объект $row.
  2. Далее происходит форматирование даты в объекте $row с помощью функции $this->datetime'process'.
  3. Затем происходит проверка, существует ли уже запись для данной отформатированной даты в массиве $chart. Если существует, то происходит обновление счетчиков для типов 'discount' и 'redeemable' в массиве $chart.
  4. Если записи для данной даты нет в массиве $chart, то создается новая запись и устанавливаются счетчики для типов 'discount' и 'redeemable'.
  5. После этого обновляются общие счетчики для типов 'discount' и 'redeemable' в массиве $total.

Есть пример запроса в sql в котором есть ошибка

CREATE TABLE `redeemed_codes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`type` enum('discount','redeemable') NOT NULL,
`datetime` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Проблема в том что поле в базе данных type enum('discount','redeemable') NOT NULL, выбирает при любом варианте только discount первое значение, нужно поправить чтобы и при сортировки в php коде так же по значению нужному выводилось и redeemable, нужна правка в sql запросе, помогите.


Ответы (1 шт):

Автор решения: Виктор Карев
  1. Для нахождения сумм лучше не использовать форматирование - лишнее время. Отформатировать можно уже непосредственно перед выводом.
  2. Слишком много условий. Проще использовать непосредственно строковые значения.
protected function redeemed_codes() {

        $total = ['discount_codes' => 0, 'redeemable_codes' => 0];

        $chart = [];
        $result = database()->query("SELECT `type`, COUNT(`id`) AS `total`, `datetime` AS `date` FROM `redeemed_codes` WHERE `datetime` BETWEEN '{$this->datetime['query_start_date']}' AND '{$this->datetime['query_end_date']}' GROUP BY `date`, `type`");
        while($row = $result->fetch_object()) {

            if(!isset($chart[$row->date])) {
                $chart[$row->date] = [
                    'discount' => 0,
                    'redeemable' => 0,
                ];
            }
            $chart[$row->date][$row->type] += $row->total;
            $total[$row->type . '_codes'] += $row->total;
        }

        $chart = get_chart_data($chart);

        return [
            'total' => $total,
            'chart' => $chart,
        ];

    }
→ Ссылка