1

#6 Laravel 5: Tạo bảng và khoá ngoại trong database

Migration là gì?

Trước khi học cách laravel 5 tạo bảng và khoá ngoại trong database, chúng ta cùng tìm hiểu một số khái niệm về Migration nhé. Khi phát triển ứng dụng với Laravel, bạn đi theo luồng code-first. Nghĩa là dev chỉ quan tâm đến vấn đề business của ứng dụng; để tăng tốc độ phát triển, dev sử dụng trực tiếp code để mô tả về các đối tượng và quan hệ của chúng trong dữ liệu ứng dụng mà không quan tâm nhiều đến Database thực sự ở phía sau.

Migration trong Laravel có nghĩa là “sự ánh xạ” hay “sự di trú”. Migration là các class PHP được dùng để mô tả các loại đối tượng, quy định kiểu dữ liệu của các thuộc tính và quan hệ giữa các đối tượng.

Khi thực hiện migrate (ánh xạ) thì Laravel sẽ chạy các migration và tác động vào database để tạo ra các bảng dữ liệu, các ràng buộc về khoá chính, khoá ngoại, v.v… một cách hoàn hảo.

Điều này có nghĩa là dev không cần phải nhớ thêm một ngôn ngữ SQL hay no-SQL nào nữa. Laravel tự chuyển đổi giữa các Hệ Quản Trị CSDL, đem lại lợi thế cực kỳ to lớn khi muốn chuyển đổi sử dụng Hệ Quản Trị CSDL khác nhau. Ví dụ ban đầu Startup của tôi nhỏ chưa có đầu tư tôi dùng MySQL, sau đó có nhiều tiền từ các nhà đầu tư, nhu cầu về database lớn lên, tôi đổi qua Oracle. Tất cả trở nên đơn giản với Migration.

Đó là chuyện lớn, chuyện thường ngày xẩy ra với team lập trình là khi mỗi người phát triền một phần chức năng, tự xây các bảng dữ liệu khác nhau, làm thế nào đồng bộ cấu trúc bảng giữa tất cả mọi người trong team? Không thể nào cứ mỗi lần có 1 người cập nhật DB thì lại phải export, import DB. Với migration, chỉ cần commit và push code. Ai cần dùng thì update code mới và chạy lệnh migrate là xong. Việc đồng bộ cấu trúc cơ sở dữ liệu quá đơn giản!

Tạo ánh xạ của bảng

Để tạo bản ánh xạ mới, dùng lệnh make:migration  của Artisan.

Một file ánh xạ mới sẽ xuất hiện trong thư mục database/migrations . Mỗi file migration có phần timestamp trong tên file để Laravel xác định thứ tự thực thi các migration. Các bạn nên chú ý thứ tự này để tạo cho đúng. Ví dụ tạo migration của bảng Category tước khi tạo migration của Post.

Cấu trúc file ánh xạ

Một file ánh xạ là một class PHP kết thừa từ class Migration của Laravel. Có hai hàm cần chú ý ở trong file này là up  và down . Trong đó up  là các thao tác trên DB khi tạo, khi migrate. Còn down  là các thao tác trên db khi xoá, khi rollback. Xem mẫu sau:

Viết ánh xạ

Sau khi chạy Artisan sẽ tạo được migration giống mẫu ở trên. việc của bạn bây giờ là định nghĩa các đối tượng dữ liệu của mình.

Tạo bảng

Để tạo bảng mới trong DB, sử dụng hàm create của Schema facade. Hàm create  nhận hai tham số, đầu tiên là tên bảng, thứ hai là một hàm Closure  trong đó sẽ định nghĩa cấu trúc bảng.

Tất nhiên, khi tạo bảng thì cần tạo cột nữa, chúng ta sẽ học tiếp về cách định nghĩa cột ngay bên dưới đây.

Kiểm tra bảng/cột tồn tại

Bạn có thể dễ dàng kiểm tra được một bảng/cột có tồn tại hay không trước khi cần tạo/xoá bảng hay cột:

Chọn kết nối và engine lưu trữ

Nếu ứng dụng của bạn có nhiều kết nối DB khác nhau, bạn có thể chọn kết nối bằng hàm connection:

Để cài đặt storage engine cho một bảng, gán tên vào thuộc tính engin của bảng:

Với MySQL có hai engine chính hay dùng là MyISAM và InnoDB.

Tạo cột

Để tạo cột, bạn có thể dùng biến $table trong tham số  thứ hai:

$table có nhiều hàm để định nghĩa cột, mà tên hàm tương ứng với các kiểu dữ liệu của cột. Xem danh sách các kiểu dữ liệu cột hỗ trợ ở đây.

Tạo index

Index là việc sắp xếp các dòng dữ liệu trong bảng theo một chỉ mục, chỉ mục này được xác định bằng cách chỉnh định sắp xếp dựa vào cột nào, ví dụ:

Hoặc tạo index trên một cột sau khi đã tạo:

Bạn cũng có thể dùng mảng để chỉ định một tổ hợp index bởi các cột:

Việc tạo index hợp lý giúp tăng tốc thao tác đọc DB rất nhiều, nhưng sẽ giảm tốc độ ghi. Do đó, nếu bảng có nhiều thao tác ghi/update dữ liệu hơn thì không nên đặt index.

Các kiểu index

Lệnh Mô tả
$table->primary('id'); Thêm khoá chính.
$table->primary(['cột1', 'cột2']); Khoá chính tổ hợp bởi các cột.
$table->unique('tên_cột'); Thêm một index bằng ràng buộc unique
$table->unique('tên_cột', 'tên_index'); Thêm index bằng tên tuỳ chọn
$table->index('tên_cột'); Thêm index cơ bản

Xoá index

Để xoá index, gọi các lệnh có chữ drop  ở trước tên lệnh tạo, ví dụ:

Khoá ngoại

Laravel hỗ trợ tạo khoá ngoại, là ràng buộc logic để chỉ sử liên quan giữa các bảng dữ liệu. Ví dụ, chúng ta cần tạo khoá ngoại “người tạo” cho bảng post , vậy chúng ta cần định nghĩa cột user_id  trên bảng post , cái sẽ giữ id  của của user  tạo ra bài viết:

Bạn cũng có thể quyết định hành vi  khi xoá hay cập nhật dữ liệu  đã có liên kết:

Để xoá khoá ngoại, dùng hàm dropForeign , tham số là tên khoá ngoại theo dạng “tên_bảng_tên_cột_foreign”

Hoặc đưa vào mảng tên cột dùng làm khoá ngoại, tên khoá cũng sẽ tự động được sinh ra phù hợp:

Xoá bảng

Để xoá bảng, đơn giản là:

Chạy ánh xạ tác động vào database

Tạo database

Để chạy tất cả các migration, dùng lệnh migrate của Artisan:

Đôi khi sẽ gặp lỗi báo “class not found” thì bạn cần chạy composer dump-autoload  chạy lại migrate là được.

Khi chạy migrate trên môi trường ứng dụng thật, để an toàn cho dữ liệu, laravel sẽ hỏi bạn có chắc chắn muốn thực hiện, để chạy migrate mà ko bị hỏi:

Cần chú ý backup data khi chạy trên môi trường thật, tránh sơ suất làm mất DB.

Chạy lại migration khi thay đổi cấu trúc bảng

Trong quá trình phát triển, cấu trúc một bảng không cố định, có thể thêm/bớt cột, tách/gộp bảng, để nhanh chóng cập nhật thay đổi lên DB, sử dụng lệnh migrate:refresh  từ Artisan:

Khi gắn thêm cờ “–seed” và dòng lệnh, sau khi cập nhật cấu trúc DB, sẽ chạy lệnh db:seed để tiến hành chèn dữ liệu mẫu vào DB. Bạn sẽđược học thêm ở bài tạo dữ liệu mẫu.

Chú ý: migrate:refresh không “cập nhật” lên DB mà thực sự nó “xoá mọi thứ và xây lại” từ đầu. Do đó, cần kết hợp lệnh này với lệnh seed để khôi phục dữ liệu đã backup vào DB. Để biết cách backup dữ liệu và chèn dữ liệu mẫu vào DB.

Bài kế tiếp trong series Lập Trình Web Với Laravel – Cơ Bản:

#7 Model trong Laravel và truy vấn dữ liệu với Eloquent

Bình luận với Facebook

Hoàng Tựa

Yêu thích lập trình web và tạo ra những thứ đẹp đẽ.

One Comment

Leave a Reply

Your email address will not be published. Required fields are marked *