Правильно создать 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,
];
}
- Цикл while проходит по каждой строке результата запроса и извлекает объект $row.
- Далее происходит форматирование даты в объекте $row с помощью функции $this->datetime'process'.
- Затем происходит проверка, существует ли уже запись для данной отформатированной даты в массиве $chart. Если существует, то происходит обновление счетчиков для типов 'discount' и 'redeemable' в массиве $chart.
- Если записи для данной даты нет в массиве $chart, то создается новая запись и устанавливаются счетчики для типов 'discount' и 'redeemable'.
- После этого обновляются общие счетчики для типов '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 шт):
Автор решения: Виктор Карев
→ Ссылка
- Для нахождения сумм лучше не использовать форматирование - лишнее время. Отформатировать можно уже непосредственно перед выводом.
- Слишком много условий. Проще использовать непосредственно строковые значения.
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,
];
}