Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
Bạn sửa cấu trúc bảng trên máy mình rồi quên báo đồng đội, thế là mỗi người một kiểu database và ứng dụng lỗi lung tung. Migration giải quyết đúng vấn đề này: mô tả thay đổi cơ sở dữ liệu bằng code, có phiên bản, có thể chạy lại và hoàn tác.
Mỗi migration là một file PHP chứa hai phần: up (áp dụng thay đổi) và down (hoàn tác). Laravel ghi nhận migration nào đã chạy trong bảng migrations, nên khi bạn chạy lệnh trên một máy khác, chỉ những migration mới mới được thực thi. Nhờ vậy cấu trúc database đi cùng Git, như mọi phần code khác.
php artisan make:migration create_orders_tablepublic function up(): void{ Schema::create('orders', function (Blueprint $table) { $table->id(); $table->foreignId('user_id')->constrained()->cascadeOnDelete(); $table->string('code', 20)->unique(); $table->decimal('total', 12, 2)->default(0); $table->string('status', 20)->default('pending')->index(); $table->timestamps(); });}public function down(): void{ Schema::dropIfExists('orders');}Chạy bằng php artisan migrate. Để xem trạng thái, dùng php artisan migrate:status. Để hoàn tác lô vừa chạy, dùng php artisan migrate:rollback.
Quy tắc vàng: đừng sửa migration đã chạy trên môi trường dùng chung. Hãy tạo migration mới để thay đổi.
php artisan make:migration add_note_to_orders_table --table=orderspublic function up(): void{ Schema::table('orders', function (Blueprint $table) { $table->text('note')->nullable()->after('status'); });}public function down(): void{ Schema::table('orders', function (Blueprint $table) { $table->dropColumn('note'); });}Lưu ý khi thêm cột vào bảng đã có dữ liệu: cột mới nên cho phép nullable hoặc có giá trị mặc định, nếu không câu lệnh sẽ lỗi hoặc ghi dữ liệu không như ý.
down đúng: dù nhiều nhóm hiếm khi rollback ở production, down chuẩn giúp bạn thử nghiệm thoải mái ở môi trường phát triển.DB::table() để tránh vỡ về sau.Migration lo cấu trúc, còn seeder lo dữ liệu mẫu hoặc dữ liệu khởi tạo. Kết hợp lệnh php artisan migrate:fresh --seed khi phát triển giúp bạn dựng lại cơ sở dữ liệu sạch chỉ trong vài giây. Tuyệt đối không chạy migrate:fresh trên production vì nó xóa toàn bộ bảng.
Trên môi trường thật, dùng php artisan migrate --force trong quy trình deploy, và luôn sao lưu trước khi chạy migration quan trọng. Với những thay đổi phá vỡ tương thích, như đổi tên hoặc xóa cột đang dùng, hãy làm theo nhiều bước: thêm cột mới, cho code ghi vào cả hai, chuyển dữ liệu, rồi mới xóa cột cũ ở lần phát hành sau.
Khi nhiều người cùng thêm migration, tên file có timestamp giúp sắp xếp thứ tự chạy. Xung đột thường xảy ra khi hai người cùng sửa một bảng; cách tránh là trao đổi sớm, và luôn kéo code mới nhất trước khi tạo migration. Nếu hai migration thêm cột khác nhau vào cùng bảng thì không sao, nhưng nếu cùng đổi một cột thì cần thống nhất.
Với dự án đã có nhiều năm lịch sử, hàng trăm file migration có thể làm việc dựng database mới chậm. Laravel cho phép nén chúng thành một file schema bằng lệnh php artisan schema:dump, sau đó các migration cũ có thể được dọn đi, còn máy mới vẫn dựng nhanh từ file schema.
Trước khi triển khai, hãy dùng php artisan migrate --pretend để xem trước các câu SQL sẽ chạy mà không thực thi thật. Đây là cách rẻ tiền để phát hiện câu lệnh nguy hiểm, ví dụ một lệnh ALTER thay đổi kiểu cột có thể làm mất dữ liệu. Kết hợp với bản sao lưu gần nhất, bạn sẽ yên tâm hơn nhiều mỗi lần phát hành.
Hãy xem tên file migration như một dòng lịch sử mà đồng đội sẽ đọc sau này. Đặt tên mô tả đúng hành động như add_status_to_orders_table thay vì update_table, và thêm chú thích ngắn khi có quyết định khó hiểu. Chi phí chỉ vài giây, nhưng giúp ích rất nhiều khi cần truy vết vì sao một cột tồn tại.
Migration biến cấu trúc database thành thứ có thể review, versioning và tự động hóa. Hãy tập thói quen mọi thay đổi database đều đi qua migration, bạn sẽ tránh được kiểu lỗi "máy tôi chạy được" rất khó chịu trong làm việc nhóm.
Muốn học bài bản và có lộ trình rõ ràng? Bạn có thể xem các khóa học trên codebem.com.
Nguyễn Đình Cường
0 comment