+1

Làm quen với Migration trong Laravel 5.x

1. Giới thiệu

Xin chào các các bạn! Bài viết này mình xin chia sẻ về khái niệm Migration trong Laravel. Như chúng ta đã biết, để xây dựng và phát triển một dự án thì cần phải làm rất nhiều việc và một trong số những yêu cầu đầu tiên là chúng ta phải xây dựng cơ sở dữ liệu, việc này bao gồm định nghĩa nội dung các bảng, tạo cấu trúc bảng như khóa chính, khóa ngoại, index, các kiểu dữ liệu của những thuộc tính trong bảng,... và sau đó chúng ta lại phải tạo dữ liệu mẫu để test các tính năng của dự án. Ngoài ra trong quá trình phát triển dự án chúng ta có thể phải cập nhật, tạo mới và thay thể các thành phần đã có trong bảng trước đó. Theo cách truyền thống thường là chúng ta sẽ truy cập vào một hệ quản trị cơ sở dữ liệu nào đó để tạo CSDL bằng cách câu lệnh SLQ hoặc có thể thao tác trực tiếp thông qua giao diện của các phần mềm hỗ trợ. Điều này sẽ làm chúng ta mất khá nhiều thời gian và gây ra những bất tiện nhất định trong quá trình phát triển dự án, đặc biệt là làm việc nhóm với nhiều thành viên tham gia phát triển. Trong Laravel (kể cả những framework khác nếu có), điều này sẽ trở nên đơn giản hơn rất nhiều với Migration và Seeder. Trong bài viết này mình sẽ chỉ giới thiệu về Migration, còn Seeder có thể mình sẽ giới thiệu trong một bài viết khác.

2. Khái niệm về Migration

Ta có thể hiểu rằng Migration giống như một hệ thống quản lý cơ sở dữ liệu (database version control) giúp quản lý tất cả các phiên bản của database một cách dễ dàng hơn cũng như làm cho việc chia sẻ và thay đổi các kiến trúc cơ sở dữ liệu trong quá trình làm việc nhóm sẽ thuận tiện hơn. Migration cho phép chúng ta định nghĩa nội dung, cấu trúc, các kiểu dữ liệu của những thuộc tính của các bảng trong CSDL.

3. Sử dụng Migration

3.1. Cấu hình

Điều kiện đầu tiên để chạy migration một cách thành công là bạn phải cấu hình để Laravel có thể kết nối chính xác tới database. Ta có thể cấu hình trong file .env (được copy từ file .env.example) với các giá trí sau (vd ở đây là cấu hình để chạy ở local):

DB_HOST=127.0.0.1
DB_DATABASE=database_name
DB_USERNAME=username
DB_PASSWORD=password

Với DB_DATABASE là tên database bạn phải tạo trước đó, DB_USERNAME là username của mysql trong máy local của bạn, tương tự DB_PASSWORD là mật khẩu cần để kết nối (dĩ nhiên trong file .env sẽ còn những key khác nhưng ở đây mình chỉ nhắc đến những key liên quan đến việc migration)

3.2. Tạo file migration

Có hai cách để bạn có thể tạo một file migration.

Cách 1: Tạo thủ công

File migration sẽ nằm trong thư mục database/migrations và bạn sẽ tạo file migration ở đây, cách này thông thường thì mọi người ít dùng nhưng với mình thì thi thoảng lại theo cách này, copy file migration đã có trước đó và sữa lại tên file cho phù hợp là okie 😅

Cách 2: Tạo bằng câu lệnh do Laravel cung cấp

  • 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

Mỗi file migration được đặt tên bao gồm timestamp luôn nằm đầu tiên trong tên file để xác định thứ tự migartion với nhau. Ví dụ, chúng ta sẽ tạo mới một migration để tạo một bảng tên là books với câu lệnh như sau:

php artisan make:migration create_books_table --create=books

Sau khi nhấn enter thì file migration sẽ được tạo trong folder database/migration và nội dung của file sẽ như sau:

<?php

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

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

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

Để thêm các field cho bảng books, chúng ta sẽ thêm trong function up() trong file migration vừa được tạo ra.

public function up()
{
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->string('category');
            $table->string('author', 30);
            $table->timestamps();
        });
}

Sau đó chạy migration để tạo bảng trong CSDL chúng ta sẽ dùng câu lênh: php artisan migrate Giả sử bây giờ một vấn đề phát sinh là sau khi chúng ta chạy migrate thì lại nhớ ra rằng chúng ta thiếu trường price của bảng books!!! Không lo, chúng ta chỉ cần tạo thêm một file migration mới với tham số trong command là --table=books với lệnh sau php artisan make:migration add_column_price_into_books_table --table=books

<?php

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

class AddColumnPriceIntoBooksTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('books', function (Blueprint $table) {
            $table->float('price', 8, 2);
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        $table->dropColumn('price');
    }
}

Tiếp theo chúng ta chạy lại câu lệnh php artisan migrate như bình thường => Done, vấn đề đã được giải quyết 😎

Chúng ta thấy trong file migration có function up()function down(). Vậy thì hai function này có chức năng gì?

function up(): Có tác dụng thực thi migration. -Khi muốn tạo mới 1 column thì sẽ viết trong function up(). -Như chúng ta thấy trong trường hợp update column thì chúng ta sư dụng hàm change() và muốn sử dụng hàm change() ta phải cài thêm package dbal của doctrine.

function down(): Có tác dụng thực thi đoạn lệnh rollback (trở về trước đó).

  • Trong hàm này sẽ thực thi các câu lệnh đảo ngược với function up().
  • Đối với tạo mới bảng, thì mặc định function down() của nó sẽ là xóa bảng đó đi bằng lệnh : Schema::dropIfExists('table_name').
  • Đối với chỉnh sửa bảng thì trong function down() phải viết các hàm ngược lại với function up().

3.3. Schema

Trong file migration để dùng Facade Schema thì chúng ta phải use Illuminate\Support\Facades\Schema. Đây là hàm Facade mà Laravel hỗ trợ để thực hiện các yêu cầu như create, update, delete bảng.

Ví dụ:

  • Tạo một bảng mới trong DB của thì chúng ta có thể sử dụng
Schema::create('books', function (Blueprint $table) {
    $table->increments('id');
});
  • Kiểm tra xem table hoặc column có tồn tại hay không thì ta dùng
if (Schema::hasTable('books')) {
    //
}
if (Schema::hasColumn('author', 'email')) {
    //
}
  • Đổi tên bảng từ books sang my_books thì ta dùng
Schema::rename('books', 'my_books')
  • Khi chúng ta muốn xóa bảng thì có thể sử dụng Schema::drop() Schema::drop('books'); Schema::dropIfExists('users');

3.4. Rollback migrate

Sau khi chúng ta chạy migrate, vì một lí do nào đó mà chúng ta muốn rollback(quay trở lại trước khi migrate) thì chúng ta sẽ chạy lệnh để rollback. Với lệnh này, toàn bộ file có batch mới nhất trong bảng migration sẽ chạy tất cả các function down() hay chính xác hơn là đảo ngược lại thay đổi mà nó tạo ra cho CSDL. Nếu không định nghĩa nội dung cho function down thì lệnh rollback coi như không có hiệu lực đồng nghĩa với việc migration đó vẫn tồn tại trong cơ sở dữ liệu. php artisan migrate:rollback

3.5. Foreign Key

Nếu chúng ta cầ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 để tạo khóa ngoại cho hai bảng.

Schema::table('books', function ($table) {
    $table->foreign('author_id')->references('id')->on('authors');
});

4. Kết luận.

Bài viết này mình đã giới thiệu cho các bạn lần đầu làm quen với Laravel những điều cơ bản nhất về Migration trong framework này, chắc chắn là bài viết vẫn còn thiếu sót và nhiều khái niệm chưa được nhắc đến nhưng cũng hy vọng rằng phần nào giúp cho các bạn hiểu thêm về Migration. Hẹn các bạn trong các bài viết tiếp theo, xin cảm ơn!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí