Written on 13th April 2026 by Carter Phan.
Migration 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.
Điều kiện tiên quyết để chạy migration một cách thành công:
Câu lệnh php artisan migrate:refresh sẽ đầu tiên rollback lại toàn bộ migration của chương trình, và thực hiện câu lệnh migrate. Tức là thực hiện function down() xong rồi thực hiện function up() trong file migration.
Câu lệnh sẽ thực hiện tái cấu trúc toàn bộ database:
php artisan migrate:refresh
php artisan migrate:refresh --seed
Tham số --seed là để chạy tất cả các Seeder chúng ta sẽ tìm hiểu trong bài sau .
Nếu muốn thực hiện function down() với số lượng batch muốn rollback thì ta dùng câu lệnh: php artisan migrate:rollback -step=n
Bây giờ chúng ta sẽ tìm hiểu kỹ hơn Schema facade thực thi như nào nhé. Trong file migration để dùng Schema thì chúng ta sẽ use Illuminate\Support\Facades\Schema.
Nếu muốn tạo một bảng mới trong DB của mình thì chúng ta có thể sử dụng
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
});
Nếu các bạn muốn kiểm tra xem table hoặc column có tồn tại hay không thì ta dùng
if (Schema::hasTable('users')) {
//
}
if (Schema::hasColumn('users', 'email')) {
//
}
Nếu muốn đổi tên bảng từ post sang posts thì ta dùng
Schema::rename('post', 'posts')
Khi chúng ta muốn xóa bảng thì có thể sử dụng Schema::drop()
Schema::drop('users');
Schema::dropIfExists('users');
Đôi khi chúng ta muốn tạo các rằng buộc cho các bảng, chúng ta có thể sử dụng cú pháp sau để rằng buộc cho 2 bảng:
Schema::table('posts', function ($table) {
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
});
Chú ý nếu không migrate mà không chạy được thì các bạn có thể tách ra làm 2 file migration để chạy.
Để drop một foreign ta dùng :
$table->dropForeign('posts_user_id_foreign');
Chúng ta nên để ý quy tắc đặt tên foreign
Bạn có thể kích hoạt hay bỏ kích hoạt việc sử dụng foreign key constraint trong migration sử dụng hai hàm sau:
Schema::enableForeignKeyConstraints();
Schema::disableForeignKeyConstraints();