Migration

Migration theo như trong document chính thức của Laravel giới thiệu nó giống như một hệ thống quản lý phiên bản giống như Git nhưng dành cho cơ sở dữ liệu của bạn. Migration cho phép bạn định nghĩa các bảng trong CSDL, định nghĩa nội dung các bảng cũng như cập nhật thay đổi các bảng đó hoàn toàn bằng PHP. Đồng thời các thao tác với CSDL này còn có thể sử dụng trên các loại CSDL khác nhau như MySQL, SQL Server, Postgres, … mà không cần phải chỉnh sửa lại code theo CSDL sử dụng.

1. Các file migration

  • Mặc định khi bạn tạo mới project Laravel sẽ có sẵn một thư mục dành cho các file migration là folder database/migrations. Toàn bộ các file migration bạn tạo ra trong quá trình làm việc sẽ được lưu trữ ở đây. Các file migration này đơn giản chỉ là các file PHP có nhiệm vụ định nghĩa cấu trúc các bảng cho CSDL của bạn.
  • Còn đây là nội dung bên trong 1 file migration

2. Cách tạo một file migration

  • Để tạo một file migration, ta sử dụng cú pháp sau trên terminal (command line):
$ php artisan make:migration <file-name> --create=<table-name>
  • Lệnh này sẽ tạo ra một file migration mới có tên dưới dạng <timestamp>_<file-name>.php. Bên trong đó sẽ tạo sẵn cho bạn cấu trúc để định nghĩa nội dung một bảng có tên giống với <table-name> mà bạn chọn ở trên.
  • Từ đó bạn có thể dễ dàng định nghĩa các cột trong bảng của mình như sau:  Tạm thời bạn chưa cần quan tầm đến hàm up bọc bên ngoài đó
  • Như các bạn đã thấy, chúng ta có thể dễ dàng định nghĩa các cột trong bảng của mình thông qua cú pháp mà Laravel cung cấp. Bạn chỉ cần định nghĩa kiểu dữ liệu thông qua các hàm mà Laravel cung cấp đi kèm đó là tên cột cùng một số chọn lựa khác như cột đó có giá trị defaul là gì, có thể để null không,…
  • Ngoài ra bạn cũng có thể định nghĩa quan hệ giữa các bảng với nhau:
  • Đoạn code trên đơn giản định nghĩa một khóa ngoại có tên là users_id liên kết với cột id trong bảng users và cột đó có dạng interger
  • Ngoài việc tạo mới bản, ta cũng có thể tạo file migration mới nhằm chỉnh sửa lại bảng bằng cú pháp tương tự như khi tạo mới file migration để tạo bảng
$ php artisan make:migration <file-name> --table=<table-name>
  • Sẽ tạo cho ta file migration mới có nhiệm vụ để cập nhật nội dung cho bảng đã được tạo trước đó

 Để chạy được hàm change() bạn cần cài thêm package tên là doctrine/dbal

  • Nếu bạn để ý kĩ, khi tạo mới bảng thì sẽ thực hiện hàm có tên Schema::create còn khi cập nhật bảng sẽ dùng hàm Schema::table. Để xem được hết các hafmg mà Laravel cung cấp cho bạn khi cập nhật chỉnh sửa hay xóa cột trong bảng bạn có thế tìm kiếm ở đây.
  • Bằng việc sử dụng migration, khi bạn tạo mới hay chỉnh sửa CSDL thì thay vì bạn phải sửa thủ công trong CSDL sau đó lại báo lại với các thành viên khác và hướng dẫn họ sửa theo bạn thì bạn chỉ cân đưa họ file migration có chứa chỉnh sửa mà bạn viết để các thành viên chạy lên và các thay đổi hoàn toàn được đồng bộ giữa mọi người.

3. Chạy file migration

  • Sau khi đã định nghĩa xong cấu trúc cũng như quan hệ giữa các bảng với nhau trong CSDL, bạn gõ lệnh:
$ php artisan migrate

và đây là kết quả chúng ta thu được sau khi chạy lệnh  Các file migration sẽ lần lượt được chạy theo thứ tự bạn tạo cho đến hết nếu không có lỗi gì.

  • Để tiến hành biến những bảng trong file migration bạn đã tạo thành các bảng trong CSDL mà bạn kết nối tới. Lưu ý để chạy lệnh này bạn cần chỉnh sửa phần khai báo CSDL trong file .env và đảm bảo các bảng có sử dụng quan hệ khóa ngoại được tạo sau các bảng cha của nó. Đây là kết quả khi chúng ta mở CSDL bằng Workbench lên xem:  Ngoài các các bảng mà chúng ta tạo từ file migration, có thể thấy xuất hiện thêm một bảng tên là migrations, đây chính là bảng dùng để quản lý các phiên bản cho CSDL của bạn cho mỗi lần chạy lệnh, nó bao gồm 1 cột id, 1 cột chứa tên file và cuối cùng là cột batch chứa lần chạy lệnh migrate mà file đó được thực hiện

 Như ví dụ trên 4 hàng đầu tiên thể hiện file migration được chạy ở lần thứ nhất, dòng thứ 5 là thể hiện file migration được tạo và chạy sau 4 file đó nên nó có batch là 2. Các file tiếp theo được thêm vào khi chạy lệnh sẽ lần lượt là 3, 4, …

  • Như trong hình ở trên mình cung cấp về nội dung file migration sẽ có hai hàm là function up() và function down(). Với function down() sẽ là các lệnh dùng để đảo ngược những định nghĩa hay chỉnh sửa trong function up(). Đối với thao tác tạo mới bảng thì mặc định function down() của các bạn sẽ là xóa bảng đó đi, còn trong trường hợp bạn chỉnh sửa bảng thì bạn cần tự thêm code vào function down() này để nó chạy ngược lại với function up().
  • Sở dĩ bạn cần định nghĩa function down() là vì ngoài lệnh php artisan migrateLaravel còn cung cấp cho chúng ta các lệnh khác là:
$ php artisan migrate:rollback

Với lệnh này, toàn bộ file có batch mới nhất trong bảng migration sẽ được thực hiện function down của nó hay chính xác hơn là đảo ngược lại thay đổi mà nó tạo ra cho CSDL. Nếu bạn không định nghĩa nội dung cho function down thì mặc dù trong bảng migration đã rollback file migration đó nhưng thực chất nó vẫn tồn tại trong CSDL hay nói cách khác lệnh rollback là vô dụng. Ngoài việc rollback từng batch một, bạn có thể tiến hành rollback nhiều batch cùng lúc bằng lệnh:

$ php artisan migrate:rollback --step=n

Với n là số lượng batch bạn muộn rollback. Ví dụ bạn đang có các batch cho các lần migrate khác nhau là 1, 2, 3, 4, 5. Khi chạy lệnh trên với n = 2 thì trong migration sẽ chỉ còn lại batch 1, 2, 3. Cuối cùng, nếu bạn muốn rollback toàn bộ thì sẽ dùng lệnh sau:

$ php artisan migrate:reset

Lệnh trên sẽ rollback toàn bộ CSDL của bạn hay đúng hơn là chạy toàn bộ function down() trong các file migration của bạn. Cuối cùng chúng ta có lệnh:

$ php artisan migrate:refresh

Lệnh này nhằm rollback toàn bộ CSDL đồng thời chạy lại luôn toàn bộ các file migrate của bạn.

Leave a reply:

Your email address will not be published.

Site Footer

Sliding Sidebar

Facebook