Table of Contents
1.Lời mở đầu

Trước phiên bản Magento 2.3, viết các install/upgrade script là cách duy nhất để chúng ta làm việc với database (Tham khảo Tạo Và Chỉnh Sửa Bảng với Setup/Upgrade Script Trong Magento2). Tuy nhiên, với phiên bản 2.3 được phát hành năm 2018, một trong những thay đổi lớn được giới thiệu đó là Declarative Schema, một cách mới mà chúng ta có thể làm việc với database mà không cần phải viết nhiều script nữa.
Nối tiếp Phần 1 Declarative Schema Trong Magento2 (Phần 1) viết về Declarative Schema, bài viết này sẽ đi vào cụ thể các use-case hay gặp. Bắt đầu thôi nào.
2. Cách thao tác với CSDL hay gặp
- Mục này mình trình bày các thao tác chúng ta hay gặp với CSDL, mình sử dụng
git diffđể minh hoa.
2.1 Tạo một bảng
- Ví dụ sau đây tạo một bảng
declarative_tablevới 4 cột, trong đóid_columnlà khóa chính.
1 | <schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
- Lưu ý Khi tạo bảng mới cần phải chạy command generate file
db_schema_whitelist.json
2.2 Xóa một bảng
- Thực hiện như sau, bảng
declarative_tablesẽ được xóa hoàn toàn.
1 | <schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
- Lưu ý: Khi xóa một bảng, không được xóa bảng đó trong file
db_schema_whitelist.json, nếu không thì bảng sẽ không được xóa.
2.3 Đổi tên bảng.
- Declarative Schema sẽ tạo một bảng mới với tên mới và xóa bảng bảng tên cũ (chữ không thực hiện đổi tên bảng).
- Do đó chúng ta phải thực hiện migrate dữ liệu từ bảng cũ sang bảng mới, dùng trigger
onCreate="migrateDataFromAnotherTable(declarative_table)"
1 | <schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
- Lưu ý Khi đổi tên bảng cần phải chạy lại command generate file
db_schema_whitelist.json
2.4 Thêm cột.
- Ví dụ sau thêm cột
date_closed
1 | <schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
- Lưu ý Khi thêm cột mới cần phải chạy lại command generate file
db_schema_whitelist.json
2.5 Xóa cột.
- Để xóa một cột chỉ cần xóa thẻ
<column>của cột đó. Nếu muốn xóa một cột mà được định nghĩa ở module khác, thì chúng ta phải khai báo lại nó với thuộc tínhdisabledbằng true
1 | <schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
- Lưu ý Chỉ có thể xóa một cột khi cột đó được định nghĩa trong file
db_schema_whitelist.json
2.6 Thay đổi kiểu dữ liệu của cột.
- Ví dụ sau thay đổi kiểu dữ liệu của cột
titletừvarcharsangtext
1 | <schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
2.7 Đổi tên cột.
Cũng giống như khi đổi tên bảng, muốn đổi tên cột chúng ta cũng phải xóa cột cũ đi và định nghĩa lại cột mới, đồng thời sử dụng attribute
onCreateđể migrate dữ liệu từ cột cũ sang cột mới.onCreate="migrateDataFrom(entity_id)"Lưu ý Khi đổi tên cột, cần phải chạy lại command generate file
db_schema_whitelist.json
2.8 Thêm một chỉ mục cho bảng.
- Ví dụ dưới đây thêm một chỉ mục có tên
INDEX_SEVERITYcho bảngdeclarative_table
1 | <schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
2.9 Tạo một khóa ngoại cho bảng.
- Ví dụ sau tạo một khóa ngoại có tên là
FL_ALLOWED_SEVERITIESđịnh nghĩa rằng cộtseveritylà khóa ngoại của bảngdeclarative_tabletham chiếu đến cộtseverity_identifiercủa bảngseverity_identifier
1 | <schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
2.10 Xoá một khóa ngoại của bảng.
- Ví dụ dưới đây sẽ xóa khóa ngoại
FL_ALLOWED_SEVERITIESbằng việc xóa đi thẻconstraint. Để có thể xóa một khóa ngoại được định nghĩa ở module khác, ta định nghĩa lại khóa ngoại này với attributedisabled="true"
1 | <schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
- Lưu ý Chỉ có thể xóa một khóa ngoại nếu nó tồn tại trong file
db_schema_whitelist.json
2.11 Tạo khóa chính khác cho bảng.
Xem xét trường hợp sau: Giả sử module A định nghĩa một bảng với khóa chính là
id_column. Module B khái báo filedb_schema.xmlcủa riêng nó, định nghĩa một cột mới lànew_id_columnvà muốn đổi khóa chính của bảng từid_columnsangnew_id_columnVới trường hợp trên, module B sẽ phải disable khóa chính ban đầu và tạo một khóa chính mới với một
referenceIdmặc dù không phải làPRIMARY, tuy nhiên giá trịreferenceIdchỉ là tên của ràng buộc ở trong filedb_schema.xml, còn tên thực sự của khóa chính này ở trong Database vẫn làPRIMARYFile
db_schema.xmlcủa module A
1 | <schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
- File
db_schema.xmlcủa module B
1 | <schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
3. Tổng Kết
Bài viết này mình đã trình bày các trường hợp hay gặp với Declarative Schema, mong sẽ bao phủ đa số các trường hợp các bạn cần.
Tham khảo thêm Phần 1 về Declarative SChema Declarative Schema Trong Magento2 (Phần 1)
Hẹn gặp lại các bạn trong các bài viết tiếp theo. Ciao!