ORM Entities và Migration được sử dụng trong các sản phẩm của OceanCodex.
Vậy ORM Entities và Migration là gì? Hoạt động và cách sử dụng chúng như thế nào?
Hãy cùng tham khảo nội dung bên dưới đây:
Nội dung bên dưới được diễn giải theo cách hiểu của tác giả, nếu có điều gì chưa đúng, vui lòng liên hệ chúng tôi để sửa đổi, bổ sung. Xin cảm ơn!
ORM Entities là gì?
Entity là một thực thể, hay cụ thể hơn: Mỗi class Entity là một thực thể ánh xạ với một bảng trong CSDL. Vậy, ánh xạ với một bảng trong CSDL để làm gì? Đó chính là để giúp bạn xây dựng cấu trúc các bảng trong CSDL một cách trực quan hơn, dễ dàng kiểm soát hơn và chắc chắn là thú vị hơn.
Migration là gì?
Migration là một trình kiểm soát phiên bản cấu trúc CSDL của bạn, và nó thật tuyệt vời để bạn có thể yên tâm xây dựng cấu trúc CSDL lớn theo thời gian, phức tạp hơn theo thời gian mà không lo bỏ sót hay sai cấu trúc bảng. Ngay cả khi bạn mang dự án đi setup trên môi trường khác, hoặc bạn phát hành dự án nhiều phiên bản theo thời gian, chỉ cần bạn chạy Migration, mọi bảng kèm theo cấu trúc CSDL mà bạn đã xây dựng sẽ được tái tạo lại hoàn chỉnh.
ORM Entities kết hợp với Migration sẽ như thế nào?
Ví dụ, bạn muốn xây dựng 1 bảng Posts, bạn tạo một entity: Posts như sau:
#[ORM\Entity]
#[ORM\Table(name: 'posts')]
class Posts extends BaseEntity {
#[ORM\Id]
#[ORM\Column(type: 'integer')]
#[ORM\GeneratedValue]
protected int $id;
#[ORM\Column(type: "string", nullable: false)]
private string $title;
#[ORM\Column(type: "string", nullable: true)]
private string $excerpt;
#[ORM\Column(type: "text", nullable: true)]
private string $content;
}
Sau đó, bạn chạy lệnh migration:diff và bạn sẽ thấy một class được tạo ra trong thư mục: database / migrations
Class này có tên: Version20240711xxxxxxx
Bạn mở tệp class đó ra và sẽ thấy trong function up() sẽ có lệnh SQL tạo bảng “posts” với các cột và cấu trúc dữ liệu giống như bạn đã khai báo ở Entity.
Migration sẽ tự động quét Entities để phát hiện ra việc Thêm/Sửa/Xóa Entities, từ đó sẽ tạo ra các bản migration chứa SQL query thực thi hành động tương tự những gì thay đổi với các Entities.
Bây giờ bạn hãy chạy lệnh migration:migrate và bạn sẽ thấy có một số bảng được tạo ra trong CSDL, như sau:
- migration_versions
- posts
Truy cập vào bảng: migration_versions bạn sẽ thấy có 1 bản ghi chứa tên Version20240711xxxxxxx.
Như vậy, Migration sẽ chạy các lệnh SQL query bên trong các bản migration có tên Version2024xxxxx và lưu tên các bản migration đã chạy để không chạy lại sau này.
Truy cập vào bảng: posts, bạn sẽ thấy các cột và cấu trúc dữ liệu của các cột giống như những gì bạn khai báo ở entity Posts.
Bây giờ, bạn hãy thử thay đổi kiểu dữ liệu của một cột trong entity “Posts”, như sau:
#[ORM\Column(type: "text", nullable: true)]
private string $excerpt;
// Chuyển cột excerpt từ kiểu string sang text.
Bạn chạy lại lệnh: migration:diff và bạn sẽ thấy một tệp tin class migration Version20240711xxxxxxx nữa sẽ được tạo ra.
Truy cập vào bên trong tệp này bạn sẽ thấy SQL query thực thi việc thay đổi kiểu dữ liệu của cột excerpt từ VARCHAR sang TEXT trong bảng posts.
Như vậy có nghĩa rằng, khi bạn thêm/sửa/xóa tác động đến các Entities thì Migration sẽ phát hiện và tạo ra các bản migration chứa SQL query để thực hiện những thay đổi đó với CSDL. Điều đó được hiểu rằng, bạn sẽ định hình cấu trúc CSDL thông qua các class Entities và Migration. Bạn không cần phải viết những đoạn code SQL query nữa, mà thay vào đó làm việc với Entities sẽ trực quan hơn, dễ dàng hiểu và kiểm soát hơn.
Sau đó bạn lại chạy lệnh: migration:migrate để áp dụng những thay đổi đó vào CSDL, cứ vậy lặp đi lặp lại…
Khi dự án của bạn lớn dần lên, bạn thêm bảng, thêm cột, thay đổi kiểu dữ liệu, xóa bảng, xóa cột, v.v… bạn chỉ cần thao tác chúng ở các Entities, sau đó chạy 2 lệnh migration:diff và migration:migrate là xong. Bạn đã có thể kiểm soát phiên bản cấu trúc CSDL của mình một cách thông minh hơn.