Laravel Tutorial

Bài 25: Migration trong Laravel

Migration giống như một hệ thống quản lý phiên bản giống như Git nhưng dành cho database. Migration cho phép bạn định nghĩa định nghĩa,  cập nhật thay đổi các table trong Database. Đồng thời các thao tác với Database này còn có thể sử dụng trên các loại Database khác nhau như MySQL, SQL Server, Postgres, … mà không cần phải chỉnh sửa lại code theo Database sử dụng.
Điều kiện tiên quyết để chạy migration một cách thành công:

  • Phải có kết nối với database .
  • migrations muốn sử dụng được thì phải nằm trong thư mục App\database\migrations

1. Khởi tạo migration

php artisan make:migration migrationName

Ví dụ: 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

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

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.

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

Đâ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');
    }
}

Phương thức up được sử dụng để thực thi code khi migrate data. Còn phương thức down  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

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

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.

Ví dụ: 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

4. Sử dụng Schema Builder

4.1. 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) {
    // ...
});

Ví dụ: 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();
});

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

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

# Xác định connection của database

Tạo mới table users 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

Ví dụ: Thiết lập engine cho table là InnoDB

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

4.2. Update table

Sử dụng tương tự như create

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

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

4.3. Đổi tên table

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

4.4. Xóa table

Schema::drop('users');
//Hoặc
Schema::dropIfExists('users');

COLUMN TRONG TABLE

Ví dụ: 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');
});

integer: Kiểu dữ liệu

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(), unsignedBigInteger(), tinyInteger(), unsignedTinyInteger()

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

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

text()

$table->text('description');

timestamp()

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

 

Leave a Comment