Cấu trúc Entity và Repository
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:
- Tạo file entity trong
src/Eccube/Entity/Custom/
(ví dụFeedback.php
) - Thêm annotation để map các cột.
- 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.

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.
Xem thêm

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