Как сделать триггер, чтобы скидывать запас ингредиентов из продукта, который они заказывают? - PullRequest
1 голос
/ 11 апреля 2020

enter image description here

Я хочу рассказать мне, как создать триггер, который позволяет мне обновлять запас ингредиентов, из которых состоит продукт, на основе рецепта, в котором он содержится.

DELIMITER //
CREATE TRIGGER tr_updStockIngredients AFTER INSERT ON detail_orders
 FOR EACH ROW 
    BEGIN
    DECLARE ingredient_id INT;
    DECLARE quantity DECIMAL;

    SELECT recp.ingredient_id, recp.quantity INTO ingredient_id, quantity
    FROM detail_orders deor, recipes recp 
    WHERE deor.food_id=NEW.food_id //5
    AND recp.food_id = deor.food_id;

    UPDATE ingredients SET stock_per_measure = stock_per_measure - quantity
    WHERE ingredients.id = ingredient_id;
END
//
DELIMITER ;

моя ошибка:

"SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1172 Результат состоит из более чем одной строки (SQL: вставить в detail_orders (order_id, комментарий, food_id, количество, цена, updated_at, create_at) значения (47,?, 1, 1, 5000.00, 2020-04-09 22:00:12, 2020-04-09 22:00:12)) "

CREATE TABLE `orders` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `order_number` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `status` int(11) NOT NULL,
  `user_id` bigint(20) UNSIGNED NOT NULL,
  `board_id` bigint(20) UNSIGNED NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `deleted_at` timestamp NULL DEFAULT NULL,
  `sale_id` bigint(20) UNSIGNED DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `detail_orders` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `comment` varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `quantity` int(11) NOT NULL,
  `price` decimal(11,2) NOT NULL,
  `discount` decimal(11,2) DEFAULT NULL,
  `order_id` bigint(20) UNSIGNED NOT NULL,
  `food_id` bigint(20) UNSIGNED DEFAULT NULL,
  `combo_id` bigint(20) UNSIGNED DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `deleted_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `foods` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `price` decimal(8,2) NOT NULL,
  `image` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `deleted_at` timestamp NULL DEFAULT NULL,
  `category_id` bigint(20) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `recipes` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `quantity` decimal(11,2) NOT NULL,
  `ingredient_id` bigint(20) UNSIGNED NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `food_id` bigint(20) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `ingredients` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `sale_price` decimal(11,2) NOT NULL,
  `stock_per_measure` int(11) NOT NULL,
  `packing` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `measure` varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL,
  `quantity_per_measure` int(11) NOT NULL,
  `status` tinyint(1) NOT NULL DEFAULT '1',
  `category_id` bigint(20) UNSIGNED NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

запрос

SELECT foods.name, 
       recipes.quantity as recipe_quantity,
       recipes.ingredient_id as recipe_ingredient,
       ingredients.name as ingredient_name,
       ingredients.stock_per_measure as ingredient_stock 
FROM foods, recipes,ingredients
WHERE foods.id =1
AND foods.id = recipes.food_id
AND ingredients.id = recipes.ingredient_id

результат

name   | recipe_quantity| recipe_ingredient|ingredient_name|ingredient_stock
Burger |2               |1                 |bread          |180
Burger |1               |2                 |letucce        |2000
Burger |1               |3                 |tomato         |2000
Burger |100             |4                 |meat           |2000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...