Допустим, клиент заказал 3 продукта

Таблица заказов продуктов:

id | order_id | product_id |  price
1  |   1      |      2     |   10
2  |   1      |      2     |   10
3  |   1      |      2     |   10

Таблица заказов:

id | total_price
1  |     30

и теперь я хочу, чтобы MySql применил специальную скидку, которая сделает 3-й элемент бесплатным в течение определенного периода времени. В результате я получу

id | total_price
1  |     20

Я использую MySql 5.6, php (symfony 2, doctrine ORM) и задаюсь вопросом, какой лучший способ создания и обработки таких сценариев.

Mike Kor

Ответы (1)

Для применения скидок в периоды необходимо разработать код, поддерживающий это. Проект может выглядеть следующим образом:

Создайте таблицу скидок:

CREATE TABLE discount(
  discount_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  rule VARCHAR(400),
  start_date DATE,
  end_date DATE
);

Строка rule может быть строкой JSON, содержащей инструкции. Эти инструкции могут отличаться каждый раз, поэтому таким образом ваша таблица будет все время одинаковой. Возможная структура JSON для этой скидки такова:

{"ruleType":"multipleProductDiscount","ruleValue":"3"}

Вы можете использовать оператор CASE для применения различных правил скидок при их обработке в коде.

Дата начала/окончания - это просто способ избежать необходимости каждый раз загружать и обрабатывать все правила. Поэтому запрос, извлекающий данные из таблицы discount, получает только активные данные:

SELECT * FROM discount WHERE somedate BETWEEN start_date AND end_date;

2022 WebDevInsider