一、数据库设计(SQL脚本)
sql
创建数据库
CREATE DATABASE IF NOT EXISTS restaurant_db;
USE restaurant_db;
餐桌表
CREATE TABLE tables (
id INT AUTO_INCREMENT PRIMARY KEY,
table_number VARCHAR(50) NOT NULL UNIQUE,
status ENUM('available', 'occupied', 'reserved') DEFAULT 'available',
capacity INT NOT NULL
);
菜单表
CREATE TABLE menu (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
description TEXT,
price DECIMAL(10, 2) NOT NULL,
category VARCHAR(50),
image_url VARCHAR(255) DEFAULT 'default.jpg'
);
订单表
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
table_id INT NOT NULL,
order_time DATETIME DEFAULT CURRENT_TIMESTAMP,
status ENUM('pending', 'preparing', 'completed', 'cancelled') DEFAULT 'pending',
total DECIMAL(10, 2) DEFAULT 0.00,
FOREIGN KEY (table_id) REFERENCES tables(id) ON DELETE CASCADE
);
订单详情表
CREATE TABLE order_items (
id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT NOT NULL,
menu_id INT NOT NULL,
quantity INT NOT NULL,
price DECIMAL(10, 2) NOT NULL, 记录下单时的价格(防价格变动影响历史订单)
FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
FOREIGN KEY (menu_id) REFERENCES menu(id) ON DELETE CASCADE
);
// 检查是否存在未完成的订单
$order_stmt = $pdo-prepare(SELECT id FROM orders WHERE table_id = ? AND status = 'pending');
$order_stmt-execute([$table_id]);
$order = $order_stmt-fetch();
// 更新订单总金额
$total_stmt = $pdo-prepare(
UPDATE orders SET total = (SELECT SUM(quantity * price) FROM order_items WHERE order_id = ?) WHERE id = ?
);
$total_stmt-execute([$order_id, $order_id]);
// 获取当前订单详情
$stmt = $pdo-prepare(
SELECT m.name, oi.quantity, oi.price, (oi.quantity * oi.price) as item_total
FROM order_items oi
JOIN menu m ON oi.menu_id = m.id
WHERE oi.order_id IN (
SELECT id FROM orders WHERE table_id = ? AND status = 'pending'
)
);
$stmt-execute([$table_id]);
$items = $stmt-fetchAll();
// 获取订单总金额
$total_stmt = $pdo-prepare(SELECT total FROM orders WHERE table_id = ? AND status = 'pending');
$total_stmt-execute([$table_id]);
$total = $total_stmt-fetchColumn() ?: 0;
?