Khi xây dựng ứng dụng Laravel cơ bản, cấu trúc cơ sở dữ liệu thường xuyên thay đổi. Bạn có thể cần thêm bảng, tạo cột mới, chỉnh sửa kiểu dữ liệu hoặc xóa một trường không còn sử dụng. Nếu thực hiện tất cả bằng tay trên database, việc theo dõi thay đổi giữa các môi trường phát triển, kiểm thử và production sẽ trở nên khó khăn. Laravel Migration giải quyết vấn đề này bằng cách biến cấu trúc database thành những file PHP có thể quản lý bằng mã nguồn.
Laravel Migration là gì?
Laravel Migration là cơ chế giúp quản lý và theo dõi các thay đổi trong cấu trúc cơ sở dữ liệu bằng code. Thay vì trực tiếp thao tác trên database, bạn có thể định nghĩa cấu trúc bảng trong Migration:
Schema::create(‘products’, function (Blueprint $table) {
$table->id();
$table->string(‘name’);
$table->decimal(‘price’, 12, 2);
$table->timestamps();
});
Sau đó Laravel sử dụng Migration để tạo bảng tương ứng trong database.
Migration thường được dùng để:
- Tạo bảng mới.
- Thêm hoặc xóa cột.
- Thay đổi cấu trúc bảng.
- Tạo khóa ngoại.
- Tạo index.
- Xóa bảng.
- Hoàn tác thay đổi database.
Có thể hiểu đơn giản, Migration giống như lịch sử thay đổi của cấu trúc database.

Vì sao Laravel cần Migration?
Giả sử một dự án có 3 lập trình viên cùng làm việc. Nếu một người tự tạo bảng bằng giao diện quản trị database, những người còn lại phải biết chính xác họ đã tạo gì để thiết lập môi trường tương tự.
Thay vì gửi hướng dẫn như:
Tạo bảng products
Thêm id
Thêm name
Thêm price
Thêm created_at
Thêm updated_at
Chỉ cần đưa Migration vào source code. Thành viên khác có thể chạy “php artisan migrate” để Laravel áp dụng các thay đổi. Điều này đặc biệt hữu ích khi làm việc nhóm, triển khai ứng dụng hoặc khởi tạo một môi trường mới.
Migration hoạt động như thế nào?
Laravel lưu thông tin các Migration đã chạy trong bảng migrations của database. Khi chạy “php artisan migrate” Laravel kiểm tra những Migration chưa được thực thi rồi chạy chúng theo thứ tự.
Có thể hình dung:
Migration file
↓
php artisan migrate
↓
Laravel kiểm tra migrations
↓
Thực thi Migration mới
↓
Cập nhật database
Tên file Migration thường có timestamp: 2026_09_11_100000_create_products_table.php. Timestamp giúp Laravel xác định thứ tự thực hiện các Migration.
Tạo Migration bằng Artisan
Laravel cung cấp Artisan Command để tạo Migration: php artisan make:migration create_products_table
File mới sẽ nằm trong: database/migrations/
Ví dụ:
database/
└── migrations/
└── 2026_09_11_100000_create_products_table.php
Một Migration thường có hai phương thức chính:
public function up(): void
{
//
}
public function down(): void
{
//
}
- up() mô tả thay đổi cần áp dụng.
- down() mô tả cách hoàn tác thay đổi đó.
Tạo bảng bằng Migration
Ví dụ tạo bảng products:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create(‘products’, function (Blueprint $table) {
$table->id();
$table->string(‘name’);
$table->decimal(‘price’, 12, 2);
$table->text(‘description’)->nullable();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists(‘products’);
}
};
Sau khi chạy “php artisan migrate” Laravel sẽ tạo bảng products.
Trong đó:
- $table->id() tạo khóa chính.
- $table->string(‘name’) tạo cột chuỗi.
- $table->decimal(‘price’, 12, 2) tạo cột số thập phân.
- nullable() cho phép giá trị NULL.
- $table->timestamps() tạo created_at và updated_at.
Các kiểu cột thường dùng
Migration cung cấp nhiều phương thức để định nghĩa cột.
| Cú pháp | Công dụng |
| id() | Khóa chính |
| string() | Chuỗi |
| text() | Văn bản dài |
| integer() | Số nguyên |
| boolean() | Giá trị đúng/sai |
| decimal() | Số thập phân |
| date() | Ngày |
| dateTime() | Ngày và giờ |
| timestamp() | Timestamp |
| json() | Dữ liệu JSON |
| foreignId() | Khóa ngoại |
Ví dụ:
$table->string(‘name’);
$table->integer(‘quantity’);
$table->boolean(‘active’);
$table->date(‘published_at’);
$table->json(‘options’);
Việc chọn kiểu dữ liệu nên dựa trên nghiệp vụ và cấu trúc database thực tế, không nên chọn tùy tiện chỉ vì cú pháp ngắn gọn.
Thêm cột vào bảng bằng Migration
Khi bảng đã tồn tại nhưng cần thêm trường mới, nên tạo Migration riêng:
php artisan make:migration add_phone_to_users_table
Sau đó:
Schema::table(‘users’, function (Blueprint $table) {
$table->string(‘phone’)->nullable();
});
Chạy:
php artisan migrate
Laravel sẽ thêm cột phone vào bảng users.
Cách này giúp lịch sử thay đổi database được lưu lại rõ ràng thay vì sửa trực tiếp Migration cũ đã được triển khai.
Tạo khóa ngoại
Migration cũng hỗ trợ định nghĩa quan hệ giữa các bảng.
Ví dụ bảng posts có user_id:
$table->foreignId(‘user_id’)
->constrained()
->cascadeOnDelete();
Có thể hiểu:
users
│
│ id
↓
posts
│
└── user_id
Khóa ngoại giúp database duy trì mối quan hệ và tính toàn vẹn dữ liệu giữa các bảng.
Cách khai báo cụ thể có thể thay đổi tùy yêu cầu của database và phiên bản Laravel đang sử dụng, nhưng nguyên tắc chung vẫn là xác định rõ bảng cha, cột liên kết và hành vi khi bản ghi liên quan bị thay đổi hoặc xóa.
Chạy Migration
Lệnh cơ bản: php artisan migrate
Laravel sẽ chạy những Migration chưa được thực thi.
Nếu database chưa được cấu hình đúng, lệnh có thể báo lỗi. Vì vậy cần kiểm tra các biến kết nối trong file .env, chẳng hạn:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
Sau khi kết nối thành công, Migration có thể tạo hoặc thay đổi cấu trúc database theo code.
Rollback Migration
Migration không chỉ tạo thay đổi mà còn cho phép hoàn tác.
Lệnh “php artisan migrate:rollback” sẽ rollback batch Migration gần nhất.
Ví dụ Migration vừa tạo bảng products, phương thức down() có: Schema::dropIfExists(‘products’);
Khi rollback, bảng có thể được xóa theo logic đã định nghĩa. Đây là lý do down() cần được viết cẩn thận. Nó giúp quá trình phát triển và kiểm thử dễ dàng hơn khi cần quay lại trạng thái trước đó.
Refresh và Reset Migration
Laravel cung cấp một số lệnh hữu ích để làm lại Migration.
migrate:reset
php artisan migrate:reset
Lệnh này rollback toàn bộ Migration đã chạy.
migrate:refresh
php artisan migrate:refresh
Lệnh này rollback Migration rồi chạy lại chúng.
Có thể kết hợp Seeder: php artisan migrate:refresh –seed
Cách này hữu ích khi cần dựng lại database trong môi trường phát triển.
Lưu ý: Không nên tùy tiện sử dụng các lệnh làm lại database trên môi trường production nếu chưa hiểu rõ tác động đến dữ liệu hiện có.
Một số lỗi thường gặp khi dùng Migration
Migration không chạy
Kiểm tra kết nối database trong .env và đảm bảo database đã tồn tại.
Sau khi thay đổi .env, có thể cần kiểm tra lại cấu hình Laravel đang sử dụng.
Cột đã tồn tại
Nếu Laravel báo cột hoặc bảng đã tồn tại, cần kiểm tra trạng thái Migration và database thực tế trước khi chạy lại.
Không nên xóa dữ liệu chỉ để xử lý lỗi mà chưa xác định nguyên nhân.
Migration chạy sai thứ tự
Laravel dựa vào timestamp trong tên Migration để xác định thứ tự.
Vì vậy, những bảng được tham chiếu bởi khóa ngoại cần được tạo theo thứ tự phù hợp.
Xóa Migration nhưng database vẫn còn dữ liệu
Xóa file Migration khỏi source code không đồng nghĩa với việc thay đổi database đã được rollback.
Database và lịch sử Migration cần được quản lý độc lập, đặc biệt khi làm việc trên môi trường đã triển khai.

Migration kết hợp với Seeder và Factory
Một quy trình phổ biến trong môi trường phát triển là:
Migration
↓
Tạo cấu trúc database
↓
Factory
↓
Tạo dữ liệu giả
↓
Seeder
↓
Đưa dữ liệu mẫu vào database
Ví dụ:
php artisan migrate
php artisan db:seed
Hoặc trong quá trình dựng lại database:
php artisan migrate:fresh –seed
Cách kết hợp này đặc biệt hữu ích khi cần nhanh chóng tạo lại một môi trường database phục vụ phát triển và kiểm thử. Nếu muốn xem cách các thành phần như Migration, Model, Factory và Seeder liên kết với nhau trong một ứng dụng thực tế, các bài viết trên Học Laravel có thể được dùng như tài liệu tham khảo theo từng chủ đề.
Kết luận
Laravel Migration là công cụ giúp quản lý cấu trúc cơ sở dữ liệu bằng code. Thông qua Migration, bạn có thể tạo bảng, thêm cột, thiết lập khóa ngoại, thay đổi cấu trúc và rollback các thay đổi mà không phải thao tác thủ công trên từng môi trường. Khi kết hợp Migration với Model, Factory và Seeder, Laravel cung cấp một quy trình tương đối hoàn chỉnh để xây dựng và quản lý database trong suốt vòng đời của ứng dụng. Điểm quan trọng nhất khi sử dụng Migration là xem mỗi thay đổi database như một phần của source code: có lịch sử, có thể kiểm soát và có thể tái tạo trên môi trường khác.

