Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 27: Migration trong Laravel 8

Tiếp tục trong chuỗi bài làm việc với Database trong Laravel, bài này mình sẽ giới thiệu với mọi người về migration trong Laravel 8.

1. Migration là gì?

Migration giống như một version control cho database, nó cho phép chúng ta định nghĩa ra các schema trong database và có thể chia sẻ đồng bộ lẫn nhau giữa các thành viên trong team.

VD: Khi bạn cần thêm một column vào trong database, thì bạn chỉ cần tạo ra thêm một file migration sau đó migrate nó vào trong database, các thành viên khác cũng chỉ việc migrate nó vào database => cấu trúc databases sẽ được đồng bộ với nhau.

2. Tạo migration trong Laravel 8.

Bạn có thể tạo migration trong Laravel 8 bằng cách sử dụng command

php artisan make:migration migrationName

Trong đó: migrationName là têm của migration bạn muốn tạo.

VD: Ví dụ mình sẽ tạo migration để tạo mới table flights.

php artisan make:migration create_flights_table

Sau khi chạy command Laravel sẽ sinh ra cho các bạn một file có định dạng YYYY_MM_DD_HHMMII_migration_name.php vào trong thư mục database/migrations

Nếu như bạn muốn tạo migration vào một đường dẫn khác bạn có thể thêm tham số --path vào trong command.

Trong quá trình xây dụng ứng dụng có thể file migration của bạn sẽ rất lớn, Laravel có cung cấp thêm cho các bạn một tính năng cho phép chúng ta squash tất cả các migration vào trong một SQL file. Để làm điều này trong Laravel các bạn chỉ việc sử dụng command

php artisan schema:dump

Trong trường hợp bạn vừa muốn squash vào file và xóa luôn hết migration hiện có thì bạn có thể sử dụng thêm tham số --prune.

VD:

php artisan schema:dump --prune

SQL file được sinh ra sẽ nằm trong thư mục database/schema. Lúc này khi bạn thực hiện migrate data Laravel sẽ thực thi câu lệnh trong file SQL trước rồi sau đó mới thực thi những migration không được xuất hiện trong SQL file.

3. Cấu trúc của migration.

Một migration class sẽ chứa 2 phương thức là updown. Phương thức up được sử dụng để thực thi các logic khi migrate data. Còn phương thức down chứa logic revert lại dữ liệu của phương thức up, phương thức này sẽ được thực thi khi chúng ta thực hiện rollback migration.

VD: Đây là cấu trúc của migration tạo bảng flights ở ví dụ trên.

<?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->timestamps();
        });
    }

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

4. Thực thi migration.

Để thực hiện migrate data các bạn sử dụng command:

php artisan migrate

Khi bạn thực thi migrate trên môi trường production thì sẽ hiện ra một promp để confirm xem bạn có thực sự muốn thực thi migrate data hay không, để đảm bảo dữ liệu của bạn không bị ảnh hưởng. Nếu bạn không muốn hiện promp khi thực thi migrate dữ liệu trên môi trường production, bạn có thể sử dụng thêm tham số --force.

VD:

php artisan migrate --force

Trong trường hợp bạn muốn thực thi rollback migrate data về phiên bản trước đó, bạn có thể sử dụng command

php artisan migrate:rollback

Trong trường hợp bạn muốn rollback data về trước đó nhiều lần, bạn có thể sử dụng tham số --step với giá trị là số lần bạn muốn rollback.

VD: Rollback data về 3 lần trước đó.

php artisan migrate:rollback --step=3

Còn nếu như bạn muốn reset tất cả các migration, các bạn có thể sử dụng command.

php artisan migrate:reset

Trong trường hợp bạn vừa muốn rollback lại tất cả các migration và đồng thời migrate dữ liệu khi rollback thành công, các bạn có thể sử dụng command.

php artisan migrate:refresh

Nếu muốn chạy seed khi thực hiện refresh migration bạn có thể truyền thêm tham số --seed.

php artisan migrate:refresh --seed

Nếu bạn muốn xóa hết table trong database và thực hiện migrate dữ liệu. Bạn có thể sử dụng command.

php artisan migrate:fresh

Nếu bạn muốn chạy thêm seed bạn có thể truyền thêm tham số --seed.

php artisan migrate:fresh --seed

5. Sử dụng Schema Builder.

Create table.

Để tạo mới table trong Schema các bạn sử dụng phương thức create với cú pháp:

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

Schema::create($tableName, function (Blueprint $table) {
    // ...
});

Trong đó: $tableName là tên của table các bạn muốn tạo.

VD: Tạo mới table users.

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();
});

Trong đó: Các logic bên trong Closure function là nơi sẽ định nghĩa cấu trúc dữ liệu của bảng (cái này sẽ nói ở dưới).

Kiểm tra sự tồn tại của table, column.

Để kiểm tra xem table có tồn tại trong database hay không bạn sử dụng phương thức hasTable.

VD: Kiểm tra sự tồn tại của table users trong database.

if (Schema::hasTable('users')) {
    // The "users" table exists...
}

Để kiểm tra collumn có tồn tại hay không bạn có thể sử dụng phương thức hasColumn với cú pháp:

Schema::hasColumn($table, $column);

Trong đó:

  • $table là tên của table các bạn cần kiểm tra.
  • $column là tên của column các bạn cần kiểm tra.

VD: Kiểm tra xem column email có tồn tại trong tables users.

if (Schema::hasColumn('users', 'email')) {
    // The "users" table exists and has an "email" column...
}

Tương tự như query builder, bạn cũng có thể xác định connection của database mà bạn muốn thực thi bằng cách sử dụng phương thức connection.

VD: Tạo mới tables trong connection sqlite

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

Bạn cũng có thể thiết lập các thuộc tính cho table trong Closure.

VD: Thiết lập engine cho table là InnoDB.

Schema::create('users', function (Blueprint $table) {
    $table->engine = 'InnoDB';

    // ...
});

Update table.

Đối với trường hợp update table các bạn sử dụng phương thức table với cú pháp tương tự như create.

VD:

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

Schema::table('users', function (Blueprint $table) {
    $table->integer('votes');
});

Đổi tên table.

Đối với trường hợp bạn muốn thay đổi tên table bạn có thể sử dụng phương thức rename với cú pháp:

use Illuminate\Support\Facades\Schema;

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

Trong đó:

  • $from là tên của table các bạn muốn đổi tên.
  • $to là tên của table các bạn muốn đổi tên thành.

Xóa table

Trong trường hợp các bạn muốn xóa table các bạn có thể sử dụng một trong 2 phương thức drop hoặc dropIfExists.

VD:

Schema::drop('users');

Schema::dropIfExists('users');

Column

Phương thức table trong Schema có thể dùng để update một table đã tồn tại trong database, cú pháp sử dụng tương tự như phương thức create.

VD: Thêm column votes vào trong table users.

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

Schema::table('users', function (Blueprint $table) {
    $table->integer('votes');
});

Mặc định, Laravel hỗ trợ chúng ta khoảng 60 phương thức hỗ các bạn tương tác với các cột với các kiểu dữ liệu khác nhau trong database. Vì nó cũng khá là nhiều nên mình cũng chỉ giới thiệu với mọi người các phương thức thường dùng thôi, còn chi tiết các bạn có thể lên trang chủ tham khảo thêm.

bigIncrements()

Phương thức này sẽ tạo ra một cột auto-increment với kiểu dữ liệu là UNSIGNED BIGINT (khóa chính).

VD:

$table->bigIncrements('id');

unsignedBigInteger()

Phương thức này sẽ tạo ra một cột có kiểu dữ liệu là UNSIGNED BIGINT.

VD:

$table->unsignedBigInteger('votes');

bigInteger()

Phương thức này sẽ tạo ra một cột có kiểu dữ liệu là BIGINT.

VD:

$table->bigInteger('votes');

integer()

Phương thức này sẽ tạo ra một cột có kiểu dữ liệu là INT.

VD:

$table->integer('votes');

unsignedInteger()

Phương thức này sẽ tạo ra một cột có kiểu dữ liệu là UNSIGNED INTEGER.

VD:

$table->unsignedInteger('votes');

mediumInteger()

Phương thức này sẽ tạo ra một cột có kiểu dữ liệu là MEDIUMIN.

VD:

$table->mediumInteger('votes');

unsignedMediumInteger()

Phương thức này sẽ tạo ra một cột có kiểu dữ liệu là UNSIGNED MEDIUMINT.

VD:

$table->unsignedMediumInteger('votes');

smallInteger()

Phương thức này sẽ tạo ra một cột có kiểu dữ liệu là SMALLINT.

VD:

$table->smallInteger('votes');

unsignedSmallInteger()

Phương thức này sẽ tạo ra một cột có kiểu dữ liệu là UNSIGNED SMALLINT.

VD:

$table->unsignedSmallInteger('votes');

tinyInteger()

Phương thức này sẽ tạo ra một cột có kiểu dữ liệu là TINYINT.

VD:

$table->tinyInteger('votes');

unsignedTinyInteger()

Phương thức này sẽ tạo ra một cột có kiểu dữ liệu là UNSIGNED TINYINT.

VD:

$table->unsignedTinyInteger('votes');

string()

Phương thức này sẽ tạo ra một cột có kiểu dữ liệu là VARCHAR với tham số thứ 2 là độ dài của string.

VD:

$table->string('name', 100);

text()

Phương thức này sẽ tạo ra một cột có kiểu dữ liệu là TEXT.

VD:

$table->text('description');

timestamp()

Phương thức này sẽ tạo ra một cột có kiểu dữ liệu là TIMESTAMP.

VD:

$table->timestamp('added_at', $precision = 0);

6. Lời Kết.

Phần này chủ yếu mình giới thiệu với mọi người cách sử dụng migration trong Laravel thôi, còn về cú pháp với các phương thức hỗ trợ các bạn có thể lên trang chủ của Laravel xem vì nó cũng khá nhiều và vẫn đang được update liên tục.

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

0 Comments

Bài viết chưa có ai bình luận, hãy là người đầu tiên đi bạn!

Bình luận

Captcha