Cấu trúc Entity và Repository

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 4 tháng 4, 2025

Làm việc với cơ sở dữ liệu là một phần không thể thiếu trong mọi hệ thống web. Trong EC-CUBE, việc thao tác với dữ liệu không sử dụng SQL trực tiếp mà dựa vào Doctrine ORM – hệ thống ánh xạ đối tượng quan hệ. Trong bài học này, bạn sẽ hiểu Entity là gì, cách ánh xạ nó với bảng trong CSDL, cách tạo mới và sử dụng Repository để truy vấn. Bài học cũng giới thiệu các loại quan hệ dữ liệu phổ biến như OneToMany, ManyToOne – rất cần thiết trong thực tế.

Cấu trúc Entity và Repositor

1. Entity là gì? Mapping với DB như thế nào?

  • Entity là một class PHP đại diện cho một bảng dữ liệu trong database.
  • Các thuộc tính trong entity là các cột trong bảng.
  • Mapping với DB thông qua annotation (hoặc YAML/XML – nhưng EC-CUBE dùng annotation).

Ví dụ đơn giản – Product entity:

// src/Eccube/Entity/Product.php

/**
 * @ORM\Entity(repositoryClass="Eccube\Repository\ProductRepository")
 * @ORM\Table(name="dtb_product")
 */
class Product
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     */
    private $name;

    // getter/setter...
}

2. Cách tạo Entity mới

Bạn có thể tạo entity riêng để phục vụ cho các plugin, module hoặc tính năng tùy chỉnh.

Các bước tạo Entity:

  1. Tạo file entity trong src/Eccube/Entity/Custom/ (ví dụ Feedback.php)
  2. Thêm annotation để map các cột.
  3. Tạo migration file (nếu cần):
    php bin/console make:migration
    php bin/console doctrine:migrations:migrate
    

Entity có thể mở rộng từ Eccube\Entity\AbstractEntity nếu muốn tái sử dụng tiện ích EC-CUBE.

3. Repository và viết custom query

  • Repository là nơi viết các phương thức truy vấn dữ liệu.
  • Mỗi entity sẽ có một repository tương ứng, ví dụ: ProductRepository.

Ví dụ – Lấy 5 sản phẩm mới nhất:

public function getLatestProducts($limit = 5)
{
    return $this->createQueryBuilder('p')
        ->orderBy('p.create_date', 'DESC')
        ->setMaxResults($limit)
        ->getQuery()
        ->getResult();
}
  • Có thể sử dụng DQL hoặc QueryBuilder tùy nhu cầu.
  • Trong controller, bạn có thể gọi:
$products = $this->productRepository->getLatestProducts();

4. Quan hệ dữ liệu – OneToMany, ManyToOne…

ORM hỗ trợ mối quan hệ giữa các bảng như:

Loại Mô tả
@OneToMany Một dòng liên kết với nhiều dòng khác
@ManyToOne Nhiều dòng liên kết về một dòng
@ManyToMany Quan hệ nhiều – nhiều

Ví dụ – Một khách hàng có nhiều đơn hàng:

// Customer.php
/**
 * @ORM\OneToMany(targetEntity="Order", mappedBy="Customer")
 */
private $Orders;
// Order.php
/**
 * @ORM\ManyToOne(targetEntity="Customer", inversedBy="Orders")
 * @ORM\JoinColumn(name="customer_id", referencedColumnName="id")
 */
private $Customer;

Quan hệ này cho phép bạn gọi:

$customer->getOrders(); // Lấy danh sách đơn hàng của khách
$order->getCustomer();  // Lấy khách hàng của đơn

Kết luận

  • Entity và Repository là xương sống dữ liệu trong EC-CUBE.
  • Hiểu và làm chủ cách mapping, truy vấn, và thiết lập quan hệ sẽ giúp bạn dễ dàng phát triển tính năng, mở rộng logic và tích hợp module/plugin.
  • Nếu bạn biết cách tận dụng Doctrine ORM, bạn sẽ không cần viết SQL thủ công mà vẫn kiểm soát tốt dữ liệu của mình.
Website Logo

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.

Bình luận

Website Logo

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.

Liên hệ công việc qua email dưới đây.

lhvuctu@gmail.com

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ