Laravel migration là công cụ quản lý cơ sở dữ liệu hiệu quả, từ việc tạo bảng đến thay đổi cấu trúc. Với các câu lệnh PHP đơn giản, Developer có thể tự tin thực hiện thay đổi mà không ảnh hưởng đến dữ liệu hiện tại. Bài viết này sẽ hướng dẫn bạn từng bước để sử dụng Laravel migration một cách thành thạo, từ khởi tạo và quản lý bảng cho đến thực hiện các thay đổi cấu trúc phức tạp. Hãy cùng khám phá cách tận dụng sức mạnh của Migration để xây dựng ứng dụng Laravel vững chắc và dễ bảo trì.

Đọc bài viết để nắm rõ:

  • Laravel migration là gì?
  • Khi nào nên sử dụng Laravel migration?
  • Làm thế nào để tạo và sử dụng Laravel migration?
  • Các câu hỏi thường gặp về Laravel migration

Laravel migration là gì?

Laravel migration là một tập hợp các hướng dẫn xác định những thay đổi bạn muốn thực hiện đối với lược đồ cơ sở dữ liệu (database schema). Những thay đổi này có thể bao gồm việc tạo bảng mới, thay đổi bảng hiện có, thêm hoặc sửa đổi cột và gieo dữ liệu ban đầu vào database. Bằng cách gói gọn những thay đổi này trong các tệp migration, Laravel đảm bảo rằng database schema của bạn vẫn được đồng bộ hóa với codebase của ứng dụng, giúp quản lý các thay đổi database trên các môi trường phát triển và giai đoạn triển khai dễ dàng hơn.

Laravel cho phép bạn thực hiện migration mà không phải lo lắng về hệ thống database cụ thể bạn đang sử dụng, dù đó là MySQL, PostgreSQL, SQLite hay các hệ thống khác được Laravel hỗ trợ. Framework này trừu tượng hóa cú pháp dành riêng cho database, giúp việc di chuyển vừa di động vừa có thể thích ứng với các hệ thống database khác nhau. Laravel migration trở thành công cụ bắt buộc phải có đối với Web Developer làm việc trên Laravel PHP framework.

Khi nào nên sử dụng Laravel migration?

Tận dụng Laravel migration bất cứ khi nào cần sửa đổi database schemas của ứng dụng như tạo bảng mới, thêm cột, sửa đổi bảng hiện có hoặc xóa toàn bộ bảng. Laravel migration cung cấp khả năng kiểm soát phiên bản cho schemas và là phương pháp an toàn để quản lý các thay đổi database mà không cần phải viết trực tiếp các truy vấn SQL.

Một số lý do chính khiến Laravel migration được lựa chọn trong các dự án phát triển web:

  • Quản lý và kiểm soát phiên bản các database schemas, cho phép thay đổi cấu trúc database theo thời gian.
  • Cách tiếp cận database cho phép viết các thay đổi schemas một lần và dễ dàng chuyển đổi giữa các hệ thống database khác nhau, chẳng hạn như MySQL, PostgreSQL, SQLite hoặc SQL Server.
  • Cung cấp công cụ khôi phục các thay đổi database, cho phép Developer khôi phục sau lỗi, điều chỉnh schemas và duy trì trạng thái database ổn định.
  • Mỗi tệp migration chứa timestamp và mô tả về những thay đổi được thực hiện, cải thiện tính minh bạch và khả năng bảo trì của codebase.
  • Kiểm soát lịch sử và đưa ra các giới hạn khôi phục.
  • Tích hợp liền mạch với thử nghiệm cho phép Developer tạo database thử nghiệm có cùng schemas với database chính của ứng dụng, giúp thực hiện các thử nghiệm liên quan đến database dễ dàng hơn
  • Tính nhất quán của codebase đảm bảo các Developer làm việc trong dự án đều có thể áp dụng thay đổi này một cách thống nhất trên các môi trường khác nhau.
  • Tính năng quản lý phụ thuộc giúp đơn giản hóa quá trình quản lý các thay đổi database phức tạp.
  • Bằng cách sử dụng các hệ thống kiểm soát phiên bản như Git., mọi thay đổi về schemas đều được chia sẻ và hợp nhất, dễ dàng được xem xét, khôi phục hoặc áp dụng trên các môi trường phát triển.
  • Laravel migration giúp tự động hóa các thao tác database, tiết kiệm thời gian cho developer và giảm thiểu lỗi.

Làm thế nào để tạo Laravel migration?

Tạo Laravel migration

Sử dụng lệnh Artisan make:migration để tạo di chuyển cơ sở dữ liệu (database migration). Các migration mới sẽ được đặt trong thư mục database/migrations của bạn. Mỗi tên tệp migration chứa timestamp cho phép Laravel xác định thứ tự di chuyển:

php artisan make:migration create_flights_table

Laravel sử dụng tên của migration để cố gắng đoán tên của bảng và liệu quá trình migration có tạo một bảng mới hay không. Nếu Laravel có thể xác định tên bảng từ tên migration, Laravel sẽ điền trước vào tệp migration được tạo bằng bảng đã chỉ định. Nếu không, bạn cần chỉ định bảng trong tệp migration theo cách thủ công.

Nếu muốn chỉ định đường dẫn tùy chỉnh cho migration được tạo, bạn có thể sử dụng tùy chỉnh –path khi thực hiện lệnh make:migration. Đường dẫn được cung cấp phải tương đối với base path của ứng dụng.

Khởi chạy Laravel migration

Để chạy tất cả các bản migration đang chờ xử lý, hãy thực hiện lệnh Artisan migrate:

php artisan migrate

Nếu bạn muốn xem những lần migration nào đã diễn ra cho đến thời điểm hiện tại, bạn có thể sử dụng lệnh Artisan migrate:status:

php artisan migrate:status

Sử dụng lệnh php artisan migrate:rollback để quay lại phiên bản di chuyển trước đó nếu cần thiết.

Nếu bạn muốn xem các câu lệnh SQL sẽ được thực thi bởi quá trình migration mà không cần chạy chúng, bạn có thể cung cấp flag –pretend cho lệnh migrate:

php artisan migrate --pretend

Laravel migration đối với Table (bảng)

Tạo bảng

Để tạo một bảng database mới, hãy sử dụng create phương thức trên schema facade. Phương thức create chấp nhận hai đối số: đối số đầu tiên là tên của bảng, đối số thứ hai là một closure đóng nhận một Blueprint đối tượng có thể được sử dụng để xác định bảng mới:

Như ví dụ dưới đây sẽ tạo bảng users với các cột id, name, emailcreated_at, updated_at:

use Illuminate\Database\Schema\Blueprint;

use Illuminate\Support\Facades\Schema;

 

Schema::create('users', function (Blueprint $table) {

    $table->id();

    $table->string('name');

    $table->string('email');

    $table->timestamps();

});

Cập nhật bảng

Phương pháp table trên schema facade có thể được sử dụng để cập nhật các bảng hiện có. Giống như phương pháp create, phương pháp table này chấp nhận hai đối số: tên của bảng và một closure nhận một Blueprint thể hiện mà bạn có thể sử dụng để thêm các cột hoặc index vào bảng:

use Illuminate\Database\Schema\Blueprint;

use Illuminate\Support\Facades\Schema;

 

Schema::table('users', function (Blueprint $table) {

    $table->integer('votes');

});

Đổi tên / Xóa bảng

Để đổi tên bảng database, hãy sử dụng phương thức rename:

use Illuminate\Support\Facades\Schema; 

Schema::rename($from, $to);

Để xóa một bảng hiện có, bạn có thể sử dụng các phương thức drop hoặc dropIfExists:

Schema::drop('users');

Schema::dropIfExists('users');

Để đổi tên bảng bằng foreign keys, bạn xác minh rằng mọi ràng buộc foreign keys trên bảng đều có tên rõ ràng trong tệp di chuyển thay vì để Laravel gán tên dựa trên quy ước. Nếu không, tên ràng buộc foreign keys sẽ tham chiếu đến tên bảng cũ.

Laravel migration đối với Column (Cột)

Tạo cột

Phương thức table trên Schema Facade có thể được sử dụng để cập nhật các bảng hiện có. Giống như phương thức create, phương thức table này chấp nhận hai đối số: tên của bảng và một closure nhận một Illuminate\Database\Schema\Blueprint thể hiện mà bạn có thể sử dụng để thêm các cột vào bảng:

use Illuminate\Database\Schema\Blueprint; 

use Illuminate\Support\Facades\Schema; 


Schema::table('users', function (Blueprint $table) { 

$table->integer('votes'); 

});

Bản thiết kế trình tạo schema cung cấp nhiều phương thức tương ứng với các loại cột khác nhau mà bạn có thể thêm vào bảng database của mình. Chi tiết các loại cột, bạn có thể xem trong file documentation tại link này.

Column modifiers (Công cụ sửa đổi cột)

Ngoài các loại cột được liệt kê ở trên, còn có một số cột “modifiers” mà bạn có thể sử dụng khi thêm cột vào bảng cơ sở dữ liệu. Ví dụ: để tạo cột “nullable”, bạn có thể sử dụng phương thức nullable:

use Illuminate\Database\Schema\Blueprint; 

use Illuminate\Support\Facades\Schema; 


Schema::table('users', function (Blueprint $table) { 

$table->string('email')->nullable(); 

});

Bảng sau chứa tất cả các cột modifiers có sẵn. Danh sách này không bao gồm các modifiers index:

Modifier Mô tả
->after(‘column’) Đặt cột “after” sau một cột khác (MySQL)
->autoIncrement() Đặt các cột INTEGER thành auto-incrementing (khóa chính)
->charset(‘utf8mb4’) Chỉ định bộ ký tự cho cột (MySQL)
->collation(‘utf8mb4_unicode_ci’) Chỉ định đối chiếu cho cột
->comment(‘my comment’) Thêm nhận xét vào một cột (MySQL / PostgreSQL)
->default($value) Chỉ định giá trị “default” cho cột
->first() Đặt cột “first” trong bảng (MySQL)
->from($integer) Đặt giá trị bắt đầu của trường auto-incrementing (MySQL / PostgreSQL)
->invisible() Làm cột “invisible” thành SELECT * các truy vấn (MySQL)
->nullable($value = true) Cho phép chèn giá trị NULL vào cột
->storedAs($expression) Tạo một cột được lưu trữ (MySQL / PostgreSQL / SQLite)
->unsigned() Đặt các cột INTEGER là UNSIGNED (MySQL)
->useCurrent() Đặt cột TIMESTAMP để sử dụng CURRENT_TIMESTAMP làm giá trị mặc định
->useCurrentOnUpdate() Đặt cột TIMESTAMP để sử dụng CURRENT_TIMESTAMP khi bản ghi được cập nhật (MySQL)
->virtualAs($expression) Tạo một cột ảo (MySQL / SQLite)
->generatedAs($expression) Tạo một cột danh tính với các tùy chọn trình tự được chỉ định (PostgreSQL)
->always() Xác định thứ tự ưu tiên của các giá trị chuỗi so với đầu vào cho một cột danh tính (PostgreSQL)

Sửa đổi cột

Phương pháp change cho phép bạn sửa đổi loại và thuộc tính của các cột hiện có. Ví dụ: bạn có thể tăng kích thước của một cột string. Để xem phương thức change hoạt động, hãy tăng kích thước của name cột từ 25 lên 50. Để thực hiện điều này, chúng ta chỉ cần xác định trạng thái mới của cột và sau đó gọi phương thức change:

Schema::table('users', function (Blueprint $table) {

$table->string('name', 50)->change();

}); 

Khi sửa đổi một cột, phải bao gồm rõ ràng tất cả các modifiers mà bạn muốn giữ lại trong định nghĩa cột – mọi thuộc tính bị thiếu sẽ bị loại bỏ. Ví dụ: để giữ lại các thuộc tính unsigned, default, và comment, bạn phải gọi từng công cụ sửa đổi một cách rõ ràng khi thay đổi cột:

Schema::table('users', function (Blueprint $table) {

$table->integer('votes')->unsigned()->default(1)->comment('my comment')->change();

});

Phương thức change không thay đổi index của cột. Do đó, bạn có thể sử dụng modifiers index để thêm hoặc xóa index một cách rõ ràng khi sửa đổi cột:

// Add an index...

$table->bigIncrements('id')->primary()->change();

 

// Drop an index...

$table->char('postal_code', 10)->unique(false)->change();

Renaming Columns (Đổi tên cột)

Để đổi tên một cột, bạn có thể sử dụng phương thức renameColumn do trình tạo schema cung cấp:

Schema::table('users', function (Blueprint $table) {

$table->renameColumn('from', 'to');

});

Dropping Columns

Để cột, bạn sử dụng phương thức dropColumn do trình tạo schema cung cấp:

Schema::table('users', function (Blueprint $table) {

$table->dropColumn('votes');

});

Bạn có thể loại bỏ nhiều cột khỏi một bảng bằng cách chuyển một mảng tên cột vào phương thức dropColumn:

Schema::table('users', function (Blueprint $table) {

$table->dropColumn(['votes', 'avatar', 'location']);

});

Laravel migration đối với Index

Tạo index

Trình xây dựng schema Laravel hỗ trợ một số loại index. Ví dụ sau tạo một cột email mới và chỉ định rằng các giá trị của nó phải là index duy nhất (Unique index). Để tạo index, chúng ta có thể xâu chuỗi phương thức unique này vào định nghĩa cột:

use Illuminate\Database\Schema\Blueprint;

use Illuminate\Support\Facades\Schema;


Schema::table('users', function (Blueprint $table) {

$table->string('email')->unique();

}); 

Ngoài ra, bạn có thể tạo index sau khi xác định cột. Để làm như vậy, bạn nên gọi phương thức unique trên bản thiết kế trình tạo schema. Phương thức này chấp nhận tên của cột sẽ nhận được index duy nhất:

$table->unique('email'); 

Bạn thậm chí có thể chuyển một mảng các cột sang một phương thức index để tạo index phức hợp (hoặc tổng hợp):

$table->index(['account_id', 'created_at']);

Khi tạo index, Laravel sẽ tự động tạo tên index dựa trên bảng, tên cột và loại index, nhưng bạn có thể chuyển đối số thứ hai cho phương thức để tự chỉ định tên index:

$table->unique('email', 'unique_email');

Có nhiều loại index phù hợp với từng nhu cầu, để biết chi tiết và hoàn chỉnh các loại Index types, bạn có thể truy cập documentation của Laravel.

Đổi tên index

Để đổi tên một index, bạn có thể sử dụng phương pháp renameIndex do bản thiết kế trình tạo schema cung cấp. Phương thức này chấp nhận tên index hiện tại làm đối số đầu tiên và tên mong muốn làm đối số thứ hai:

$table->renameIndex('from', 'to') 

Xóa/Giảm index

Để xóa index, bạn phải chỉ định tên của index. Theo mặc định, Laravel tự động gán tên index dựa trên tên bảng, tên cột được lập index và loại index. Dưới đây là một số ví dụ:

Nếu bạn chuyển một mảng cột vào một phương thức loại bỏ index, tên index thông thường sẽ được tạo dựa trên tên bảng, cột và loại index:

Schema::table('geo', function (Blueprint $table) {

$table->dropIndex(['state']); // Drops index 'geo_state_index'

});

Events

Để thuận tiện sử dụng, mỗi hoạt động migration sẽ gửi một event. Tất cả các event sau đây đều mở rộng base class Illuminate\Database\Events\MigrationEvent:

Class Mô tả
Illuminate\Database\Events\MigrationsStarted Một loạt lệnh migration sắp được thực hiện
Illuminate\Database\Events\MigrationsEnded Một loạt quá trình migration đã được thực hiện xong
Illuminate\Database\Events\MigrationStarted Một cuộc migration duy nhất sắp được thực hiện
Illuminate\Database\Events\MigrationEnded Một lần migration duy nhất đã hoàn tất
Illuminate\Database\Events\NoPendingMigrations Lệnh migration không tìm thấy bất kỳ migration nào đang chờ xử lý
Illuminate\Database\Events\SchemaDumped Kết xuất database schema đã hoàn thành
Illuminate\Database\Events\SchemaLoaded Kết xuất database schema hiện có đã được tải

Câu hỏi thường gặp về Laravel migration

Có thể khôi phục quá trình di chuyển của Laravel không?

Khôi phục mọi thay đổi bằng lệnh php artisan migrate:rollback như bên dưới:

2019_08_19_000000_create_failed_jobs_table .......................................................................................... 1ms DONE

2019_05_10_000000_add_fields_to_action_events_table ................................................................................. 8ms DONE

2018_01_01_000000_create_action_events_table ........................................................................................ 1ms DONE

2014_10_12_100000_create_password_resets_table ...................................................................................... 1ms DONE

2014_10_12_000000_create_users_table ................................................................................................ 1ms DONE

Hãy đảm bảo sử dụng phương pháp down() một cách chính xác. Phương pháp down() phải làm ngược lại với phương pháp up()

use Illuminate\Support\Facades\Schema;

use Illuminate\Database\Schema\Blueprint;

use Illuminate\Database\Migrations\Migration;


return new class extends Migration {

    public function up()

    {

        Schema::table('posts', function (Blueprint $table) {

            // The column was a boolean, but we want to switch to a datetime.

            $table->datetime('is_published')->nullable()->change();

        });

    }


    public function down()

    {

        Schema::table('posts', function (Blueprint $table) {

            // When rolling back, we have to restore the column to its previous state.

            $table->boolean('is_published')->default(false)->change();

        });

    }

}

Có thể chạy Laravel migration khi đang kiểm thử không?

Câu trả lời là bạn có thể chạy Laravel migration trong môi trường kiểm thử bằng cách sử dụng lệnh chỉ định môi trường thử nghiệm: php artisan migrate –env=testing

Có thể sửa đổi các cột hiện có trong quá trình di chuyển của Laravel không?

Bạn có thể sửa đổi các cột hiện có trong Laravel migration bằng hàm change của phương thức table. Sau đây là ví dụ:

public function up()

{

    Schema::table('your_table_name', function (Blueprint $table) {

        $table->string('new_column_name')->change();

    });

}

Tại sao nên sử dụng Migrate?

  • Dễ dàng quản lý cấu trúc database: Migrate cung cấp giao diện đơn giản để tạo, sửa đổi và xóa các yếu tố database, giúp bạn dễ dàng quản lý cấu trúc database của ứng dụng.
  • Kiểm soát phiên bản: Migrate sử dụng hệ thống tập tin để lưu trữ các thay đổi cấu trúc database, giúp bạn dễ dàng theo dõi và quản lý lịch sử thay đổi.
  • Hợp tác: Nhiều Developer có thể làm việc cùng nhau trên cấu trúc database của ứng dụng bằng cách sử dụng Migrate.
  • Giảm lỗi: Migrate giúp giảm thiểu lỗi do việc sửa đổi cấu trúc database thủ công.

Đọc thêm: Top 18 tài nguyên học Laravel hay nhất năm 2024

Các loại Migrate phổ biến

Có hai loại Migrate phổ biến:

  • Up migrations: Tạo hoặc sửa đổi các yếu tố database.
  • Down migrations: Hoàn tác các thay đổi được thực hiện bởi Up migrations.

Tổng kết Laravel migration

Có thể thấy, Laravel migration giúp các Developer đơn giản hóa việc quản lý database trong các ứng dụng Laravel. Bằng cách cung cấp khả năng kiểm soát phiên bản, di chuyển, hỗ trợ cộng tác, khôi phục và cải thiện tính nhất quán. Những lợi ích này góp phần nâng cao quá trình phát triển, giúp ứng dụng hiệu quả và đáng tin cậy hơn. Hy vọng rằng với những thông tin ITviec vừa chia sẻ, bạn đã nắm rõ cách tạo, khởi chạy và sử dụng Laravel migration hiệu quả nhất.