لإنشاء الاستعلامات الأساسية في MySQL لنظام إدارة المخازن، إليك قائمة بأهم العمليات، بدءًا من إنشاء الجداول وحتى استعلامات الإضافة والاستعلامات الخاصة بالحركات المخزنية.
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
sku VARCHAR(255) UNIQUE NOT NULL,
price DECIMAL(10, 2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);CREATE TABLE warehouses (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
location VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);CREATE TABLE product_warehouse (
id INT AUTO_INCREMENT PRIMARY KEY,
product_id INT NOT NULL,
warehouse_id INT NOT NULL,
quantity INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE,
FOREIGN KEY (warehouse_id) REFERENCES warehouses(id) ON DELETE CASCADE
);CREATE TABLE inventory_transactions (
id INT AUTO_INCREMENT PRIMARY KEY,
product_id INT NOT NULL,
warehouse_id INT NOT NULL,
transaction_date DATETIME NOT NULL,
transaction_type ENUM('IN', 'OUT') NOT NULL,
quantity INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE,
FOREIGN KEY (warehouse_id) REFERENCES warehouses(id) ON DELETE CASCADE
);INSERT INTO products (name, sku, price) VALUES ('Product Name', 'SKU001', 100.00);INSERT INTO warehouses (name, location) VALUES ('Warehouse A', 'Location A');عند إضافة كمية أولية لمنتج معين في مستودع، يجب تحديث جدول product_warehouse:
INSERT INTO product_warehouse (product_id, warehouse_id, quantity) VALUES (1, 1, 100);يمكنك استخدام هذا الاستعلام لتسجيل إدخال أو إخراج منتج من مستودع معين:
INSERT INTO inventory_transactions (product_id, warehouse_id, transaction_date, transaction_type, quantity)
VALUES (1, 1, NOW(), 'IN', 50); -- إدخال كمية 50لتسجيل إخراج كمية معينة:
INSERT INTO inventory_transactions (product_id, warehouse_id, transaction_date, transaction_type, quantity)
VALUES (1, 1, NOW(), 'OUT', 30); -- إخراج كمية 30هذا الاستعلام سيحسب الكمية الصافية للمنتج داخل المستودع، من خلال جمع عمليات الإدخال وطرح عمليات الإخراج.
SELECT
pw.product_id,
pw.warehouse_id,
(COALESCE(SUM(CASE WHEN it.transaction_type = 'IN' THEN it.quantity ELSE 0 END), 0) -
COALESCE(SUM(CASE WHEN it.transaction_type = 'OUT' THEN it.quantity ELSE 0 END), 0)) AS total_quantity
FROM
product_warehouse pw
LEFT JOIN
inventory_transactions it ON pw.product_id = it.product_id AND pw.warehouse_id = it.warehouse_id
WHERE
pw.product_id = 1 AND pw.warehouse_id = 1
GROUP BY
pw.product_id, pw.warehouse_id;يمكنك تخصيص استعلام لحساب الكميات خلال فترة زمنية معينة:
SELECT
pw.product_id,
pw.warehouse_id,
(COALESCE(SUM(CASE WHEN it.transaction_type = 'IN' THEN it.quantity ELSE 0 END), 0) -
COALESCE(SUM(CASE WHEN it.transaction_type = 'OUT' THEN it.quantity ELSE 0 END), 0)) AS total_quantity
FROM
product_warehouse pw
LEFT JOIN
inventory_transactions it ON pw.product_id = it.product_id AND pw.warehouse_id = it.warehouse_id
WHERE
pw.product_id = 1 AND pw.warehouse_id = 1
AND it.transaction_date BETWEEN '2024-01-01' AND '2024-12-31'
GROUP BY
pw.product_id, pw.warehouse_id;يمكنك كتابة دالة تحديث تلقائية بحيث يتم تعديل الكمية في product_warehouse عند كل عملية إدخال أو إخراج في inventory_transactions.
UPDATE product_warehouse AS pw
JOIN (
SELECT
product_id,
warehouse_id,
(SUM(CASE WHEN transaction_type = 'IN' THEN quantity ELSE 0 END) -
SUM(CASE WHEN transaction_type = 'OUT' THEN quantity ELSE 0 END)) AS total_quantity
FROM
inventory_transactions
GROUP BY
product_id, warehouse_id
) AS tq ON pw.product_id = tq.product_id AND pw.warehouse_id = tq.warehouse_id
SET
pw.quantity = tq.total_quantity;- جدولة تحديث الكميات: يمكنك استخدام دوال أو Triggers في MySQL لضبط الكميات تلقائيًا عند إضافة أي حركة جديدة.
- الفحص قبل العمليات: قبل تسجيل حركة مخزنية من نوع
OUT، يفضل فحص الكمية المتوفرة في المستودع لضمان عدم وجود نقص. - الربط في Laravel: يمكنك تطبيق الاستعلامات أعلاه باستخدام
Eloquentفي Laravel لتبسيط العمل مع قاعدة البيانات وجعل الشيفرة قابلة للصيانة.