Trong các ứng dụng lớn, bạn có thể gặp tình huống cần điều kiện hóa việc chạy migration — ví dụ: chỉ chạy migration nếu database là MySQL, hoặc nếu một bảng nào đó chưa tồn tại.
Từ Laravel 12 trở đi, bạn có thể sử dụng phương thức mới shouldRun() trong migration để kiểm soát việc chạy hay bỏ qua migration đó, giúp bạn xây dựng hệ thống linh hoạt, thông minh và ít lỗi hơn.
🧠 shouldRun() là gì?
shouldRun() là một phương thức tùy chọn có thể khai báo trong migration class.
Nếu được định nghĩa và trả về false, Laravel sẽ bỏ qua migration đó khi bạn chạy:
php artisan migrate✅ Khi nào nên dùng shouldRun()?
- Khi bạn chỉ muốn migration chạy với một loại database cụ thể.
- Khi bạn muốn bỏ qua migration đã xử lý bằng cách khác (ex: đã tạo bảng thủ công).
- Khi bạn muốn quản lý các module động, ví dụ: module "blog" có bảng riêng nhưng chưa luôn luôn được kích hoạt.
🔧 Cách sử dụng shouldRun() trong migration
📄 Ví dụ 1: Chỉ chạy migration nếu database là MySQL
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;
return new class extends Migration
{
public function shouldRun(): bool
{
return DB::getDriverName() === 'mysql';
}
public function up(): void
{
Schema::create('mysql_only_table', function (Blueprint $table) {
$table->id();
$table->string('name');
});
}
public function down(): void
{
Schema::dropIfExists('mysql_only_table');
}
};📄 Ví dụ 2: Chỉ chạy nếu bảng chưa tồn tại
public function shouldRun(): bool
{
return !Schema::hasTable('users');
}📄 Ví dụ 3: Tùy thuộc vào cấu hình hoặc biến môi trường
public function shouldRun(): bool
{
return config('modules.blog.enabled') === true;
}⚠️ Lưu ý khi dùng shouldRun()
| Điều kiện | Ý nghĩa |
|---|---|
Trả về true | Laravel sẽ chạy migration như bình thường |
Trả về false | Laravel sẽ bỏ qua migration này (và không lưu vào bảng migrations) |
Không định nghĩa shouldRun() | Mặc định true – luôn chạy |
🔍 So sánh với giải pháp cũ
Trước đây bạn buộc phải làm thủ công:
public function up(): void
{
if (DB::getDriverName() !== 'mysql') {
return;
}
// ...
}Nhược điểm:
- Laravel vẫn lưu migration đó vào bảng
migrations - Không rõ ràng về logic điều kiện chạy
→ shouldRun() giúp tách biệt rõ ràng và không ghi nhận vào bảng migrations nếu không cần thiết.
✅ Tổng kết
Tính năng shouldRun() trong Laravel 12 là một công cụ mạnh mẽ, giúp bạn:
- Viết migration thông minh, điều kiện hóa theo môi trường
- Tránh lỗi khi chạy ở môi trường không phù hợp
- Quản lý dễ dàng các module hoặc nền tảng đa dạng (MySQL, SQLite, PostgreSQL...)
Hãy bắt đầu thêm shouldRun() vào các migration module hoặc môi trường đặc biệt trong dự án Laravel 12 của bạn để giữ cho hệ thống gọn gàng, an toàn và linh hoạt hơn.
🔔 Theo dõi CodeTutHub để cập nhật các tính năng mới và kỹ thuật Laravel hiện đại!








