PHP và MySQL – Category DAO

Mô hình DAO cho một danh mục (Category) trong PHP hoạt động tương tự như mô hình DAO cho người dùng (User), nhưng thay vì làm việc với dữ liệu người dùng, bạn sẽ thao tác với các danh mục sản phẩm, bài viết, hoặc bất kỳ loại danh mục nào khác. Dưới đây là một ví dụ về cách triển khai mô hình DAO cho đối tượng Category.

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

Giả sử chúng ta giữ nguyên cấu trúc thư mục như sau:

/project
    /config
        database.php
    /dao
        CategoryDAO.php
    /models
        Category.php
    /controllers
        CategoryController.php
    /views
        category_view.php
    index.php

2. Lớp mô hình (Category.php)

Lớp này đại diện cho một đối tượng Category.

<?php
class Category {
    private $id;
    private $name;
    private $description;

    // 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 getName() {
        return $this->name;
    }

    public function setName($name) {
        $this->name = $name;
    }

    public function getDescription() {
        return $this->description;
    }

    public function setDescription($description) {
        $this->description = $description;
    }
}
?>

3. Lớp DAO (CategoryDAO.php)

Lớp này chịu trách nhiệm thao tác với cơ sở dữ liệu liên quan đến đối tượng Category.

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

class CategoryDAO {
    private $conn;

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

    public function getAllCategories() {
        $query = "SELECT id, name, description FROM categories";
        $stmt = $this->conn->prepare($query);
        $stmt->execute();

        $categories = [];

        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $category = new Category();
            $category->setId($row['id']);
            $category->setName($row['name']);
            $category->setDescription($row['description']);

            $categories[] = $category;
        }

        return $categories;
    }

    public function getCategoryById($id) {
        $query = "SELECT id, name, description FROM categories WHERE id = ?";
        $stmt = $this->conn->prepare($query);
        $stmt->bindParam(1, $id);
        $stmt->execute();

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

        $category = new Category();
        $category->setId($row['id']);
        $category->setName($row['name']);
        $category->setDescription($row['description']);

        return $category;
    }

    public function createCategory($category) {
        $query = "INSERT INTO categories SET name=:name, description=:description";
        $stmt = $this->conn->prepare($query);

        $stmt->bindParam(":name", $category->getName());
        $stmt->bindParam(":description", $category->getDescription());

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

    public function updateCategory($category) {
        $query = "UPDATE categories SET name=:name, description=:description WHERE id=:id";
        $stmt = $this->conn->prepare($query);

        $stmt->bindParam(":name", $category->getName());
        $stmt->bindParam(":description", $category->getDescription());
        $stmt->bindParam(":id", $category->getId());

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

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

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

4. Lớp điều khiển (CategoryController.php)

Lớp này là cầu nối giữa mô hình Category và DAO CategoryDAO. Nó nhận yêu cầu từ người dùng, gọi DAO để lấy dữ liệu, và sau đó gửi dữ liệu đến view.

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

class CategoryController {
    private $categoryDAO;

    public function __construct() {
        $this->categoryDAO = new CategoryDAO();
    }

    public function listCategories() {
        return $this->categoryDAO->getAllCategories();
    }

    public function getCategory($id) {
        return $this->categoryDAO->getCategoryById($id);
    }

    public function createCategory($name, $description) {
        $category = new Category();
        $category->setName($name);
        $category->setDescription($description);

        return $this->categoryDAO->createCategory($category);
    }

    public function updateCategory($id, $name, $description) {
        $category = new Category();
        $category->setId($id);
        $category->setName($name);
        $category->setDescription($description);

        return $this->categoryDAO->updateCategory($category);
    }

    public function deleteCategory($id) {
        return $this->categoryDAO->deleteCategory($id);
    }
}
?>

5. View (category_view.php)

View hiển thị danh sách các danh mục và các thông tin chi tiết về từng danh mục.

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

$categoryController = new CategoryController();
$categories = $categoryController->listCategories();
?>

<!DOCTYPE html>
<html lang="vi">
<head>
    <meta charset="UTF-8">
    <title>Danh sách danh mục</title>
</head>
<body>
    <h1>Danh sách danh mục</h1>
    <ul>
        <?php foreach ($categories as $category) { ?>
            <li><?php echo "ID: " . $category->getId() . " - Tên: " . $category->getName() . " - Mô tả: " . $category->getDescription(); ?></li>
        <?php } ?>
    </ul>
</body>
</html>

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

  1. Model (Category.php): Đại diện cho dữ liệu của một danh mục và chứa các phương thức getter và setter để truy xuất và thay đổi thuộc tính.
  2. DAO (CategoryDAO.php): Quản lý các truy vấn cơ sở dữ liệu liên quan đến danh mục, thực hiện các tác vụ như thêm, sửa, xóa, và lấy dữ liệu danh mục.
  3. Controller (CategoryController.php): Xử lý logic nghiệp vụ, nhận yêu cầu từ người dùng và tương tác với DAO.
  4. View (category_view.php): Hiển thị danh sách các danh mục và thông tin liên quan đến người dùng cuối.

Mô hình này giúp mã nguồn của bạn trở nên tổ chức hơn, dễ quản lý và dễ dàng mở rộng khi cần.