Laravel Migration là gì? Quản lý cơ sở dữ liệu cực dễ

Laravel Migration là gì?

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.

Laravel Migration là gì?
Laravel Migration là gì?

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.

READ  Laravel Query Builder là gì? Truy vấn cơ sở dữ liệu linh hoạt

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_atupdated_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:

READ  Laravel Validation là gì? Chuẩn hóa dữ liệu đầu vào an toàn

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 postsuser_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.

READ  Laravel Eloquent là gì? Tìm hiểu ORM mạnh mẽ nhất của PHP

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.

Một số lỗi thường gặp khi dùng Migration
Một số lỗi thường gặp khi dùng Migration

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.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *