Quản Lý Bảng Bằng Migrations

Quản Lý Bảng Bằng Migrations
Migration là công cụ hữu ích của Laravel vì nó cho phép ta tạo các bảng và các cột cơ sở dữ liệu bằng dòng lệnh PHP. Các bạn có thể truy cập và cập nhật dễ dàng.

Trong Laravel có 1 tính năng quan trọng mà các bạn cần nhớ. Đó chính là migrations. Để xây dựng một dự án hoàn chỉnh, các bạn cần xây dựng cơ sở dữ liệu vững chắc. Trong đó, bộ dữ liệu mẫu cần phải hoàn thiện để phục vụ quá trình phát triển các chức năng cho dự án. 

 

Đối với PHP thông thường, các bạn nên truy cập vào 1 hệ thống quản trị cơ sở dữ liệu để tạo cơ sở dữ liệu bằng câu lệnh SQL hoặc từ giao diện. Tuy nhiên, cách này thủ công và không thuận tiện thao tác khi một dự án đòi hỏi nhiều lập trình viên tham gia và phát triển. 

 

Laravel gỡ nút thắt này bằng cách cung cấp tính năng migrations và có seeder. Seeder thì chúng ta sẽ tìm hiểu sau. Ở bài chia sẻ này, các bạn sẽ hiểu được migrations và quản lý bằng migrations ra sao. 

 

Migrations là gì?

 

Migrations được ví như 1 hệ thống quản lý phiên bản (tương tự như Git) nhưng nó được sinh ra là dành cho cơ sở dữ liệu. Migrations cho phép ta định nghĩa toàn bộ các bảng trong hệ thống cơ sở dữ liệu, nội dung có trong các bảng và cập nhật thay đổi các bảng bằng PHP. 

 

Các thao tác thực hiện trên cơ sở dữ liệu cũng có thể được sử dụng trên các hệ cơ sở dữ liệu khác như MySQL, SQL, Server, Postgres,…mà ta không phải chỉnh sửa lại phần code theo cơ sở dữ liệu đang sử dụng. Các điều kiện tiên quyết để các bạn có thể chạy migrations trong Laravel: kết nối với database và migrations nhất định phải nằm trong thư mục App\database\migrations.

 

Cấu hình database 

 

Nếu muốn sử dụng được migrations, các bạn cần phải cấu hình để Laravel có thể kết nối được với database. Hệ thống Laravel cung cấp 2 file cấu hình cơ bản:

 

  • Cấu hình trong file /.env (thường được sử dụng ở localhost) 
  • Cấu hình trong /config/database.php (cấu hình này được thêm vào để chạy khi sản phẩm đã đưa thành production)

 

Cấu hình ở local 

 

Để tạo cấu hình database ở local, các bạn cần vào file .env và thiết lập cài đặt. 

 

APP_ENV=local
APP_DEBUG=true
APP_KEY=jnGIndjFo8F1i3PhgSfzodig50YoS4pc
DB_HOST=name-host
DB_DATABASE=name-db
DB_USERNAME=username-db
DB_PASSWORD=password-db
CACHE_DRIVER=file
SESSION_DRIVER=file

 

Trong đó:

 

  • name-host: điền tên host (ở đây sẽ là localhost)
  • name-database: điền vào tên database đã tạo
  • username-db: điền vào username dùng để đăng nhập db (ở đây thường là root, mặc định đối với wamp hoặc xampp)
  • password-db: điền vào password dùng để đăng nhập db (ở đây thường là rỗng mặc định đối với wamp hoặc xampp)

 

Cấu hình production 

 

Các bạn thiết lập cấu hình trong file config/database.php như sau: 

 

 'mysql',
    /*
    |--------------------------------------------------------------------------
    | Database Connections
    |--------------------------------------------------------------------------
    |
    | Here are each of the database connections setup for your application.
    | Of course, examples of configuring each database platform that is
    | supported by Laravel is shown below to make development simple.
    |
    |
    | All database work in Laravel is done through the PHP PDO facilities
    | so make sure you have the driver for your particular database of
    | choice installed on your machine before you begin development.
    |
    */
    'connections' => [
        'sqlite' => [
            'driver' => 'sqlite',
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
        ],
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
        'pgsql' => [
            'driver' => 'pgsql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'schema' => 'public',
            'sslmode' => 'prefer',
        ],
        'sqlsrv' => [
            'driver' => 'sqlsrv',
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '1433'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
        ],
    ],
    /*
    |--------------------------------------------------------------------------
    | Migration Repository Table
    |--------------------------------------------------------------------------
    |
    | This table keeps track of all the migrations that have already run for
    | your application. Using this information, we can determine which of
    | the migrations on disk haven't actually been run in the database.
    |
    */
    'migrations' => 'migrations',
    /*
    |--------------------------------------------------------------------------
    | Redis Databases
    |--------------------------------------------------------------------------
    |
    | Redis is an open source, fast, and advanced key-value store that also
    | provides a richer set of commands than a typical key-value systems
    | such as APC or Memcached. Laravel makes it easy to dig right in.
    |
    */
    'redis' => [
        'client' => 'predis',
        'default' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => env('REDIS_DB', 0),
        ],
        'cache' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => env('REDIS_CACHE_DB', 1),
        ],
    ],
];

 

Tại trường 'default' => 'mysql': mysql là cơ sở dữ liệu mà bạn sẽ kết nối tới. Bạn có thể thay đổi nó bằng postgres, sqlite,…Tiếp theo, bạn nên cấu hình cho 2 loại cơ sở dữ liệu mà bạn đã chọn. Ở đây, chúng ta dùng mysql nên phải thiết lập cấu hình cho nó như sau: 

 

'mysql' => [
    'driver'    => 'mysql',
    'host'      => env('DB_HOST', 'name-host'),
    'database'  => env('DB_DATABASE', 'name-database'),
    'username'  => env('DB_USERNAME', 'username-database'),
    'password'  => env('DB_PASSWORD', 'password-database'),
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
    'strict'    => false,
],

 

  • name-host: tên host của bạn
  • name-database: tên cơ sở dữ liệu của bạn
  • username-db: username đăng nhập vào db
  • password-db: password đăng nhập vào db của bạn

 

Cấu trúc của migrations như thế nào?

 

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateTable extends Migration
{
    public function up()
    {
        //đoạn lệnh khi thực hiện migrate
    }
    public function down()
    {
        //đoạn lệnh thực hiện khi Rollback.
    }
}

 

Cách tạo file migration 

 

Thông thường, các bạn có thể chọn 1 trong 2 cách để tạo file migration. 

 

Cách thủ công 

 

Ở cách này, các bạn vào database/migrations tạo mới 1 file. Nếu còn bỡ ngỡ, thì các bạn chọn cách thủ công. Còn muốn nhanh và có cảm giác hứng thú hơn, thì sử dụng cách số 2. 

 

Tạo bằng câu lệnh command line 

 

Tạo migrations thông thường:

 

php artisan make:migration "ten_migrate"

 

Tạo mới migrations cho bảng: 

 

php artisan make:migration TenMigrate --create=TableName

 

Tạo migrations chỉnh sửa bảng:

 

php artisan make:migration TenMigrate --table=TableName

 

Ví dụ thực tiễn 

 

Ví dụ 1

 

Các bạn tạo mới 1 migration cho bảng categories với dòng lệnh:

 

php artisan make:migration createcategoriestable --create=categories

 

string('name')->nullable();
            $table->text('description')->nullable();
            $table->increments('id');
            $table->timestamps();
        });
    }

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

 

Ví dụ 2

 

Các bạn tạo 1 migration chỉnh sửa bảng với dòng lệnh:

 

php artisan make:migration updatecategoriestable --table=categories

 

string('name_category')->nullable()->change();
            $table->string('description')->nullable()->change();
            $table->integer('parent_id')->nullable();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('categories', function (Blueprint $table) {
            $table->string('name')->nullable()->change();
            $table->text('description')->nullable()->change();
            $table->dropColumn('parent_id');
        });
    }
}

 

Trong file migration phía trên có function up(), function down() và hàm Façade Schema. 

 

  • Function up() có tác dụng thực thi migration. Khi bạn muốn tạo mới một column, bạn cần thực hiện trong function up(). 
  • Function down() có tác dụng thực thi dòng lệnh rollback (trở về trước đó). Ở đây, nó sẽ thực hiện các câu lệnh đảo ngược với function up(). 

 

Khi tạo mới 1 bảng, mặc định function down() sẽ là xóa bảng đó đi bằng dòng lệnh Schema::dropIfExists('table_name'). Khi muốn chỉnh sửa 1 bảng, các bạn cần tạo các hàm ngược lại với function up() ở trong function down(). 

 

Hàm Façade schema là hàm mà Laravel thường hỗ trợ để chúng ta thực hiện các chức năng như tạo mới, cập nhật hoặc xóa bảng. 

 

Các dòng lệnh tạo bảng tiêu biểu thường dùng trong migrations 

 

Câu lệnh

Giải thích

$table->bigIncrements('id');

Tăng ID (primary key) sử dụng như "UNSIGNED BIG INTEGER"

$table->bigInteger('votes');

Cột tương đương với BIGINT

$table->boolean('confirmed');

Kiểu BOOLEAN 

$table->date('created_at');

Tương đương kiểu date

$table->dateTime('created_at');

Tương đương kiểu DATETIME

$table->dateTimeTz('created_at');

Tương đương với DATETIME (với timezone)

$table->decimal('amount', 8, 2);

Cột tương đương DECIMAL với độ chính xác (tổng số) và tỷ lệ (chữ số thập phân)

$table->double('amount', 8, 2);

Cột tương đương DOUBLE với độ chính xác (tổng 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 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 GEOMETRYCOLLECTION

$table->increments('id');

Cột tương đương tăng dần UNSIGNED INTEGER (khóa chính) 

$table->integer('votes');

Tương đương INTEGER

$table->ipAddress('visitor');

Cột tương đương địa chỉ IP

$table->json('options');

Cột tương đương kiểu JSON

$table->jsonb('options');

Cột tương đương kiểu JSONB

$table->lineString('positions');

Cột tương đương kiểu LINESTRING

$table->longText('description');

Cột tương đương kiểu LONGTEXT

$table->macAddress('device');

Cột tương đương địa chỉ MAC

$table->mediumIncrements('id');

Cột tương đương tự động gia tăng MEDIUMINT (khóa chính)

$table->mediumInteger('votes');

Cột tương đương kiểu MEDIUMINT

$table->mediumText('description');

Cột tương đương kiểu MEDIUMTEXT

$table->morphs('taggable');

Thêm các cột tương đương taggable_idUNSIGNED BIGINT và taggable_typeVARCHAR

$table->multiLineString('positions');

Cột tương đương MULTILINESTRING

$table->multiPoint('positions');

Cột tương đương kiểu MULTIPOINT

$table->multiPolygon('positions');

Cột tương đương kiểu MULTIPOLYGON

$table->nullableMorphs('taggable');

Thêm các phiên bản cột morphs() không có giá trị

$table->nullableTimestamps();

Bí danh của phương thức timestamps()

$table->point('position');

Cột tương đương kiểu POINT

$table->polygon('positions');

Cột tương đương kiểu POLYGON

$table->rememberToken();

Thêm một cột remember_token tương đương VARCHAR (100)

$table->smallIncrements('id');

Cột tương đương tự động gia tăng SMALLINT (khóa chính)

$table->smallInteger('votes');

Cột tương đương kiểu SMALLINT

$table->softDeletes();

Thêm cột deleted_at tương đương TIMESTAMP có thể vô hiệu cho các lần xóa mềm

$table->softDeletesTz();

Thêm cột deleted_at tương đương TIMESTAMP (có múi giờ) có thể vô hiệu cho các lần xóa mềm

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

Cột tương đương VARCHAR với độ dài tùy chọn

$table->text('description');

Cột tương đương kiểu TEXT

$table->time('sunrise');

Cột tương đương kiểu TIME

$table->timeTz('sunrise');

Cột tương đương kiểu TIME (có múi giờ)

$table->timestamp('added_on');

Cột tương đương TIMESTAMP

$table->timestampTz('added_on');

Cột tương đương TIMESTAMP (có múi giờ)

$table->timestamps();

Thêm các cột rỗng created_at và updated_at tương đương TIMESTAMP

$table->timestampTz();

Thêm các cột rỗng created_at và updated_at tương đương TIMESTAMP (có múi giờ)

$table->tinyIncrements('id');

Cột tương đương tự động gia tăng TINYINT (khóa chính)

$table->tinyInteger('votes');

Cột tương đương kiểu TINYINT

$table->unsignedBigInteger('votes');

Cột tương đương kiểu UNSIGNED BIGINT

$table->unsignedDecimal('amount', 8, 2);

Cột tương đương UNSIGNED DECEDAL với độ chính xác (tổng số) và tỷ lệ (chữ số thập phân)

 

 

 

Hồ Hữu Hiền

Mình là developer nên đôi khi viết bài không hay lắm mong các bạn thông cảm. Nếu muốn biết thêm thông tin về mình thì vui lòng vào website này để biết. https://huuhienqt.dev/

Bình luận (0)