Maxim Mozes
Участник
- Регистрация
- 27 Мар 2021
- Сообщения
- 95
- Реакции
- 217
Есть код
Проблема в том что поле в базе данных `type` enum('discount','redeemable') NOT NULL, выбирает при любом варианте только discount первое значение, нужно поправить чтобы и при сортировки в php коде так же по значению нужному выводилось и redeemable, нужна правка в sql запросе, помогите, за помощь подкину монет на RU банк любой.
PHP:
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']($row->formatted_date).
- Затем происходит проверка, существует ли уже запись для данной отформатированной даты в массиве $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 запросе, помогите, за помощь подкину монет на RU банк любой.