Tìm hiểu về Migration trong Laravel.

Chào các bạn, tiếp tục với series tìm hiểu về Laravel, hôm này mình sẽ hướng dẫn các bạn sử dụng Migration trong Laravel.

1. Giới thiệu chung

Migration trong Laravel cho phép quản lý lược đồ trong cơ sở dữ liệu của bạn. Nó cho phép bạn và team sửa đổi và chia sẻ lược đồ cơ sở dữ liệu cho nhau. Đồng bạn có thể thao tác trên các cơ sở dữ liệu khác nhau mà không cần chỉnh sửa lại code theo cơ sở dữ liệu đang sử dụng.

2. Tạo Migration

Để tạo một migration trong Laravel sử dụng lệnh Artisan php artisan make:migration create_users_table Mỗi file migration được đặt tên bao gồm timestamp để xác định thứ tự migartion với nhau. Các tùy chọn --table--create cũng có thể được sử dụng để chỉ ra tên của bảng và việc migration có tạo bảng mới hay không. Các tùy chọn này điền trước câu lệnh tạo migration:

php artisan make:migration create_users_table --create=users

php artisan make:migration add_votes_to_users_table --table=users

3. Cấu trúc một file migration

Một lớp migration chứa hai phương thức: updown. Phương thức up được sử dụng để thêm bảng mới, cột, hoặc chỉ số cơ sở dữ liệu của bạn, còn phương thức down sẽ đảo ngược các hoạt động được thực hiện bởi phương thức up. Ví dụ: migration sau đây tạo một bảng flights:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateFlightsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('flights', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('airline');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('flights');
    }
}

4. Chạy Migration

Để chạy tất cả các file migration dùng lệnh migrate:

php artisan migrate

Di chuyển trở lại trạng thái trước:

php artisan migrate:rollback

Bạn có thể khôi phục một số lượng step nhất định của migration bằng cách cung cấp tùy chọn step cho rollback ví dụ:

php artisan migrate:rollback --step=5

Bạn cũng có thể rollback về trạng thái ban đầu của migration:

php artisan migrate:reset

Rollback và tạo lại cơ sở dữ liệu của bạn:

php artisan migrate:refresh

// Refresh the database and run all database seeds...
php artisan migrate:refresh --seed

Nếu muốn rollback về các step trước đó và chạy lại migration bạn có thẻ dùng câu lệnh sau:

php artisan migrate:refresh --step=5

Lệnh sau sẽ xóa tất cả các table trong cơ sở dữ liệu của bạn và chạy lại migration:

php artisan migrate:fresh

php artisan migrate:fresh --seed

5. Schema

Nếu muốn tạo một bảng mới trong DB của mình thì chúng ta có thể sử dụng:

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
});

Nếu các bạn muốn kiểm tra xem table hoặc column có tồn tại hay không thì ta dùng 2 method hasTablehasColumn:

if (Schema::hasTable('users')) {
    //
}

if (Schema::hasColumn('users', 'email')) {
    //
}

Đổi tên hoặc xóa table:

//đổi tên bảng
Schema::rename('post', 'posts')
//xóa bảng
Schema::drop('users');

Schema::dropIfExists('users');

Tạo cột:

$table->string('email');

Các câu lệnh để bạn có thể tạo type cho cột dễ dàng hơn:

Cú pháp Mô tả
$table->bigIncrements('id'); Tăng ID (primary key) sư dụng như "UNSIGNED BIG INTEGER".
$table->bigInteger('votes'); Tương đương với BIGINT.
$table->binary('data'); Tương đương với BLOB.
$table->boolean('confirmed'); Tương đương với BOOLEAN.
$table->char('name', 4); Tương đương với CHAR với độ dài cho trước.
$table->date('created_at'); Tương đương với DATE.
$table->dateTime('created_at', 0); Cột tương đương với dữ liệu chính xác (tổng chữ số).
$table->dateTimeTz('created_at', 0); Cột tương đương DATETIME (với múi giờ) với độ chính xác (tổng chữ số).
$table->decimal('amount', 8, 2); Cột tương đương DECIMAL với độ chính xác (tổng chữ số) và tỷ lệ (chữ số thập phân).
$table->double('amount', 8, 2); Cột tương đương NHÂN ĐÔI với độ chính xác (tổng chữ số) và tỷ lệ (chữ số thập phân).
$table->enum('level', ['easy', 'hard']); Cột tương đương ENUM.
$table->float('amount', 8, 2); Cột tương đương FLOAT với độ chính xác (tổng chữ số) và tỷ lệ (chữ số thập phân).
$table->geometry('positions'); Cột tương đương GEOMETRY.
$table->geometryCollection('positions'); Cột tương đương GEOMETRYCOLLMENT.
$table->increments('id'); Cột tự động tăng tương đương cột không tương đương (khóa chính).
$table->integer('votes'); Cột tương đương INTEGER.
$table->ipAddress('visitor'); Địa chỉ IP cột tương đương.
$table->json('options'); Cột tương đương JSON.
$table->jsonb('options'); Cột tương đương JSONB.
$table->lineString('positions'); LINE LINEING cột tương đương.
$table->longText('description'); Cột tương đương LONGTEXT.
$table->macAddress('device'); Cột địa chỉ MAC tương đương.
$table->mediumIncrements('id'); Cột tự động tăng tương đương cột MEDIUMINT (khóa chính) không tương tự.
$table->mediumInteger('votes'); Cột tương đương MEDIUMINT.
$table->mediumText('description'); Cột tương đương MEDIUMTEXT.
$table->morphs('taggable'); Thêm các cột tương đương taggable_idBIGINT và taggable_typeVARCHAR.
$table->uuidMorphs('taggable'); Thêm các cột tương đương taggable_idCHAR (36) và taggable_typeVARCHAR (255) UUID.
$table->multiLineString('positions'); MULTILINESTRING cột tương đương.
$table->multiPoint('positions'); Cột tương đương MULTIPOINT.
$table->multiPolygon('positions'); Cột tương đương MULTIPOLYGON.
$table->nullableMorphs('taggable'); Thêm các phiên bản nullable của cột.
$table->nullableUuidMorphs('taggable'); Thêm các phiên bản nullable của cột.
$table->nullableTimestamps(0); Bí danh của phương pháp.
$table->point('position'); ĐIỂM cột tương đương.
$table->polygon('positions'); Cột tương đương POLYGON.
$table->rememberToken(); Thêm một remember_tokencột tương đương VARCHAR (100) không thể rỗng .
$table->set('flavors', ['strawberry', 'vanilla']); SET cột tương đương.
$table->smallIncrements('id'); Cột tương đương tự động tăng không giới hạn SMALLINT (khóa chính).
$table->smallInteger('votes'); Cột tương đương SMALLINT.
$table->softDeletes('deleted_at', 0); Thêm một deleted_atcột tương đương TIMESTAMP không thể xóa để xóa mềm với độ chính xác (tổng số chữ số).
$table->softDeletesTz('deleted_at', 0); Thêm một deleted_atcột tương đương TIMESTAMP (có múi giờ) không thể xóa để xóa mềm với độ chính xác (tổng chữ số).
$table->string('name', 100); Cột tương đương VARCHAR với chiều dài.
$table->text('description'); Cột tương đương.
$table->time('sunrise', 0); Cột tương đương TIME với độ chính xác (tổng chữ số).
$table->timeTz('sunrise', 0); Cột tương đương TIME (với múi giờ) với độ chính xác (tổng chữ số).
$table->timestamp('added_on', 0); Cột tương đương TIMESTAMP với độ chính xác (tổng chữ số).
$table->timestampTz('added_on', 0); Cột tương đương TIMESTAMP (với múi giờ) với độ chính xác (tổng chữ số).
$table->timestamps(0); Thêm các cột tương đương nullable created_atvà updated_atTIMESTAMP với độ chính xác (tổng chữ số).
$table->timestampsTz(0); Thêm các cột tương đương nullable created_atvà updated_atTIMESTAMP (với múi giờ) với độ chính xác (tổng chữ số).
$table->tinyIncrements('id'); Tự động tăng cột tương đương TINYINT (khóa chính) không được ký.
$table->tinyInteger('votes'); Cột tương đương TINYINT.
$table->unsignedBigInteger('votes'); Cột tương đương BIGINT chưa ký.
$table->unsignedDecimal('amount', 8, 2); Cột tương đương KHAI THÁC KHÔNG GIỚI HẠN với độ chính xác (tổng chữ số) và tỷ lệ (chữ số thập phân).
$table->unsignedInteger('votes'); Cột tương đương INTEGER INTEGER.
$table->unsignedMediumInteger('votes'); Cột tương đương MEDIUMINT.
$table->unsignedSmallInteger('votes'); Cột tương đương KHÔNG NHỎ.
$table->unsignedTinyInteger('votes'); Cột tương đương TINYINT chưa ký.
$table->uuid('id'); Cột tương đương UUID.
$table->year('birth_year'); Cột tương đương NĂM.

Column Modifier

Modifier Mô tả
->after('column') Đặt cột "sau" cột khác (MySQL)
->autoIncrement() Đặt cột INTEGER làm tăng tự động (khóa chính)
->charset('utf8') Chỉ định một bộ ký tự cho cột (MySQL)
->collation('utf8_unicode_ci') Chỉ định đối chiếu cho cột (MySQL / PostgreSQL / SQL Server)
->comment('my comment') Thêm một bình luận vào một cột (MySQL / PostgreSQL)
->default($value) Chỉ định giá trị "mặc định" cho cột
->first() Đặt cột "đầu tiên" trong bảng (MySQL)
->nullable($value = true) Cho phép (theo mặc định) các giá trị NULL được chèn vào cột
->storedAs($expression) Tạo một cột được tạo lưu trữ (MySQL)
->unsigned() Đặt các cột INTEGER là UNSIGNED (MySQL)
->useCurrent() Đặt các cột TIMESTAMP để sử dụng CURRENT_TIMESTAMP làm giá trị mặc định
->virtualAs($expression) Tạo một cột được tạo ảo (MySQL)
->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 mức độ ưu tiên của các giá trị chuỗi so với đầu vào cho một cột định danh (PostgreQuery)

Modifying Table

Các bạn có thể mở terminal lên và cài thư viện doctrine để có thể sử dụng các hàm hữu ích trong nó.composer require doctrine/dbal Chúng ta thường hay mắc phảỉ sau khi migrate bảng rồi lại sực nhớ ra mình lại không muốn đặt tên cột như thế nữa. Để giải quyết vấn đề đó , thư viện doctrine có hàm xử lý được.

Schema::table('users', function ($table) {
    $table->renameColumn('from', 'to');
});

Hay một vấn đề nữa đó chính là mình muốn giới hạn giá trị kiểu dữ liệu của một cột

Schema::table('users', function ($table) {
    $table->string('name', 50)->nullable()->change();
});

Foreign Key Constraints

Đôi khi chúng ta muốn tạo các rằng buộc cho các bảng, chúng ta có thể sử dụng cú pháp sau để rằng buộc cho 2 bảng:

Schema::table('posts', function ($table) {
    $table->integer('user_id')->unsigned();

    $table->foreign('user_id')->references('id')->on('users');
});

Chú ý nếu không migrate mà không chạy được thì các bạn có thể tách ra làm 2 file migration để chạy. Để drop một foreign ta dùng : $table->dropForeign('posts_user_id_foreign'); Chúng ta nên để ý quy tắc đặt tên foreign <tên_table>_<tên_khóa_ngoại>_foreign Bạn có thể kích hoạt hay bỏ kích hoạt việc sử dụng foreign key constraint trong migration sử dụng hai hàm sau:

Schema::enableForeignKeyConstraints();

Schema::disableForeignKeyConstraints();

6. Kết luận

Mình đã giới thiệu cho các những câu lệnh và cách sử dụng cơ bản nhất về Migration trong Laravel , hẹn các trong bài viết sau. Mọi thắc mắc cần giải đáp hãy để lại comment ở phía dưới nhé!