PHP và MySQL – OrderItem DAO

Mô hình DAO cho OrderItem (Chi tiết đơn hàng) sẽ quản lý các thao tác CRUD (Create, Read, Update, Delete) liên quan đến các sản phẩm trong một đơn hàng cụ thể. Mô hình này cho phép bạn dễ dàng truy xuất, thêm, sửa hoặc xóa các mặt hàng thuộc về một đơn hàng trong cơ sở dữ liệu. Dưới đây là cách triển khai chi tiết mô hình DAO cho OrderItem trong PHP.

1. Cấu trúc thư mục

Giữ nguyên cấu trúc thư mục như sau để tổ chức các tệp tin của bạn:

/project
    /config
        database.php
    /dao
        OrderItemDAO.php
    /models
        OrderItem.php
    /controllers
        OrderItemController.php
    /views
        order_item_view.php
    index.php

2. Tệp cấu hình cơ sở dữ liệu (database.php)

Tệp này chứa logic kết nối tới cơ sở dữ liệu sử dụng PDO.

<?php
class Database {
    private $host = "localhost";
    private $dbname = "database_name";
    private $username = "username";
    private $password = "password";
    public $conn;

    public function getConnection() {
        $this->conn = null;

        try {
            $this->conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->dbname, $this->username, $this->password);
            $this->conn->exec("set names utf8");
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch(PDOException $exception) {
            echo "Connection error: " . $exception->getMessage();
        }

        return $this->conn;
    }
}
?>

3. Lớp mô hình (OrderItem.php)

Lớp OrderItem đại diện cho một đối tượng chi tiết đơn hàng với các thuộc tính như id, order_id, product_id, quantity, price, v.v. và các phương thức getter và setter tương ứng.

<?php
class OrderItem {
    private $id;
    private $order_id;
    private $product_id;
    private $quantity;
    private $price;

    // Getter và Setter cho từng thuộc tính
    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function getOrderId() {
        return $this->order_id;
    }

    public function setOrderId($order_id) {
        $this->order_id = $order_id;
    }

    public function getProductId() {
        return $this->product_id;
    }

    public function setProductId($product_id) {
        $this->product_id = $product_id;
    }

    public function getQuantity() {
        return $this->quantity;
    }

    public function setQuantity($quantity) {
        $this->quantity = $quantity;
    }

    public function getPrice() {
        return $this->price;
    }

    public function setPrice($price) {
        $this->price = $price;
    }
}
?>

4. Lớp DAO (OrderItemDAO.php)

Lớp này chịu trách nhiệm về các thao tác cơ sở dữ liệu như thêm, sửa, xóa, và truy vấn dữ liệu liên quan đến chi tiết đơn hàng.

<?php
require_once 'config/database.php';
require_once 'models/OrderItem.php';

class OrderItemDAO {
    private $conn;

    public function __construct() {
        $database = new Database();
        $this->conn = $database->getConnection();
    }

    public function getAllOrderItemsByOrderId($order_id) {
        $query = "SELECT id, order_id, product_id, quantity, price FROM order_items WHERE order_id = ?";
        $stmt = $this->conn->prepare($query);
        $stmt->bindParam(1, $order_id);
        $stmt->execute();

        $orderItems = [];

        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $orderItem = new OrderItem();
            $orderItem->setId($row['id']);
            $orderItem->setOrderId($row['order_id']);
            $orderItem->setProductId($row['product_id']);
            $orderItem->setQuantity($row['quantity']);
            $orderItem->setPrice($row['price']);

            $orderItems[] = $orderItem;
        }

        return $orderItems;
    }

    public function getOrderItemById($id) {
        $query = "SELECT id, order_id, product_id, quantity, price FROM order_items WHERE id = ?";
        $stmt = $this->conn->prepare($query);
        $stmt->bindParam(1, $id);
        $stmt->execute();

        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        $orderItem = new OrderItem();
        $orderItem->setId($row['id']);
        $orderItem->setOrderId($row['order_id']);
        $orderItem->setProductId($row['product_id']);
        $orderItem->setQuantity($row['quantity']);
        $orderItem->setPrice($row['price']);

        return $orderItem;
    }

    public function createOrderItem($orderItem) {
        $query = "INSERT INTO order_items SET order_id=:order_id, product_id=:product_id, quantity=:quantity, price=:price";
        $stmt = $this->conn->prepare($query);

        $stmt->bindParam(":order_id", $orderItem->getOrderId());
        $stmt->bindParam(":product_id", $orderItem->getProductId());
        $stmt->bindParam(":quantity", $orderItem->getQuantity());
        $stmt->bindParam(":price", $orderItem->getPrice());

        if($stmt->execute()) {
            return true;
        }
        return false;
    }

    public function updateOrderItem($orderItem) {
        $query = "UPDATE order_items SET order_id=:order_id, product_id=:product_id, quantity=:quantity, price=:price WHERE id=:id";
        $stmt = $this->conn->prepare($query);

        $stmt->bindParam(":order_id", $orderItem->getOrderId());
        $stmt->bindParam(":product_id", $orderItem->getProductId());
        $stmt->bindParam(":quantity", $orderItem->getQuantity());
        $stmt->bindParam(":price", $orderItem->getPrice());
        $stmt->bindParam(":id", $orderItem->getId());

        if($stmt->execute()) {
            return true;
        }
        return false;
    }

    public function deleteOrderItem($id) {
        $query = "DELETE FROM order_items WHERE id = ?";
        $stmt = $this->conn->prepare($query);
        $stmt->bindParam(1, $id);

        if($stmt->execute()) {
            return true;
        }
        return false;
    }
}
?>

5. Lớp điều khiển (OrderItemController.php)

Lớp điều khiển (Controller) kết nối giữa các lớp DAO và View, xử lý logic nghiệp vụ cho chi tiết đơn hàng.

<?php
require_once 'dao/OrderItemDAO.php';

class OrderItemController {
    private $orderItemDAO;

    public function __construct() {
        $this->orderItemDAO = new OrderItemDAO();
    }

    public function listOrderItemsByOrderId($order_id) {
        return $this->orderItemDAO->getAllOrderItemsByOrderId($order_id);
    }

    public function getOrderItem($id) {
        return $this->orderItemDAO->getOrderItemById($id);
    }

    public function createOrderItem($order_id, $product_id, $quantity, $price) {
        $orderItem = new OrderItem();
        $orderItem->setOrderId($order_id);
        $orderItem->setProductId($product_id);
        $orderItem->setQuantity($quantity);
        $orderItem->setPrice($price);

        return $this->orderItemDAO->createOrderItem($orderItem);
    }

    public function updateOrderItem($id, $order_id, $product_id, $quantity, $price) {
        $orderItem = new OrderItem();
        $orderItem->setId($id);
        $orderItem->setOrderId($order_id);
        $orderItem->setProductId($product_id);
        $orderItem->setQuantity($quantity);
        $orderItem->setPrice($price);

        return $this->orderItemDAO->updateOrderItem($orderItem);
    }

    public function deleteOrderItem($id) {
        return $this->orderItemDAO->deleteOrderItem($id);
    }
}
?>

6. View (order_item_view.php)

View chịu trách nhiệm hiển thị thông tin về các chi tiết đơn hàng cho người dùng.

<?php
require_once 'controllers/OrderItemController.php';

$orderItemController = new OrderItemController();
$order_id = 1;  // Giả sử ta đang muốn xem các chi tiết của đơn hàng có id là 1
$orderItems = $orderItemController->listOrderItemsByOrderId($order_id);
?>

<!DOCTYPE html>
<html lang="vi">
<head>
    <meta charset="UTF-8">


    <title>Chi tiết đơn hàng</title>
</head>
<body>
    <h1>Chi tiết đơn hàng</h1>
    <ul>
        <?php foreach ($orderItems as $orderItem) { ?>
            <li><?php echo "ID: " . $orderItem->getId() . " - Sản phẩm ID: " . $orderItem->getProductId() . " - Số lượng: " . $orderItem->getQuantity() . " - Giá: " . $orderItem->getPrice(); ?></li>
        <?php } ?>
    </ul>
</body>
</html>

Tóm tắt mô hình DAO cho OrderItem:

  1. Model (OrderItem.php): Đại diện cho dữ liệu chi tiết đơn hàng với các thuộc tính như id, order_id, product_id, quantity, price.
  2. DAO (OrderItemDAO.php): Thực hiện các thao tác CRUD (Create, Read, Update, Delete) với cơ sở dữ liệu liên quan đến chi tiết đơn hàng.
  3. Controller (OrderItemController.php): Xử lý logic nghiệp vụ, tương tác với DAO và chuẩn bị dữ liệu cho View.
  4. View (order_item_view.php): Hiển thị dữ liệu chi tiết đơn hàng, chẳng hạn như danh sách các mặt hàng trong một đơn hàng cụ thể.

Mô hình DAO này giúp mã nguồn của bạn dễ quản lý, bảo trì và mở rộng, đồng thời tăng cường tính bảo mật và tái sử dụng mã nguồn.