Cách dùng Migration để sửa bảng (table) trong Laravel

Trong bài trước chúng ta đã học cách tạo các Migration để tạo các bảng trong database rồi phải không nào thế nhưng nếu bạn muốn thay đổi các bảng trong database thì sao nhỉ. Bài viết này sẽ hướng dẫn bạn cách dùng Migration để sửa các bảng trong database Laravel nhé

1. Tại sao cần sửa đổi bảng trong cơ sở dữ liệu

Khi sử dụng Migration để tạo bảng đôi lúc chúng ta cần thêm hay chỉnh sửa các trường hay nội dung của bảng và đó là điều hoàn toàn có thể xảy ra. Đối với các bảng mới tinh chưa có nội dung gì để chỉnh sửa bảng ta có thể thực hiện xóa bảng (table) đang tồn tại trên phpMyAdmin, đồng thời thay đổi nội dung bên trong file Migration tương ứng, xong chạy lại lệnh Migration là xong. Thế nhưng với các bảng đã có nội dung thì chúng ta không thể làm thế được mà phải sử dụng cách khác.

2. Cách dùng Migration để sửa bảng (table) trong Laravel 

Xét lại ví dụ trước chúng ta đã tạo được bảng tintuc với các trường sau id, headline, email bây giờ chúng ta muốn chỉnh sửa bảng này thì làm thế nào. Các bạn hãy xem ví dụ dưới để biết cách nhé!

Chúng ta cần tạo một Migration mới dành riêng cho việc sửa đổi bảng như sau: tạo file Migration edit_tintuc_table.php bằng lệnh

php artisan make:migration edit_tintuc_table --table=tintuc

Lúc này file Migration 2021_01_16_090806_edit_tintuc_table.php đã được tạo bên trong thư mục /database/migrations/ với nội dung sau:

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class EditTintucTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('tintuc', function (Blueprint $table) {
            //
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('tintuc', function (Blueprint $table) {
            //
        });
    }
}

Ta thấy nội dung tương tự như tạo file create_tintuc_table.php, nhưng 2 function up() và down() đang là rỗng.

2.1 Thêm cột dữ liệu

Để thêm cột mới (VD như cột description) vào bảng tintuc, ta điều chỉnh file edit_tintuc_table.php vừa tạo như sau:

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class EditTintucTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('tintuc', function (Blueprint $table) {
            $table->string('description');
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('tintuc', function (Blueprint $table) {            
        });
    }
}

Chạy lại lệnh php artisan migrate

php artisan migrate

hiển thị kết quả sau đây là thành công:

Kiểm tra lại bảng tintuc trên phpMyAdmin chúng ta thấy một cốt mới đã được thêm vào

2.2 Thay đổi cột dữ liệu

Để thay đổi được dữ liệu trên bảng ví dụ thay đổi tên cột, ta cần phải cài thêm thư viện Doctrine/dbal vào Laravel, nếu chưa có thì các bạn chạy dòng lệnh sau tại thư mục project laravel

composer require doctrine/dbal

Kết quả như sau là cài đặt thư viện Doctrine/dbal thành công:

Giả sử bây giờ chúng ta cần thay đổi tên cột headline thành title, và cần thêm một cột mới là slug, ta tiến hành thay đổi file edit_tintuc_table.php như sau:

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class EditTintucTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('tintuc', function (Blueprint $table) {
            //$table->string('description');
            $table->renameColumn('headline', 'title');
            $table->string('slug');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('tintuc', function (Blueprint $table) {
            
        });
    }
}

Có thể thấy dòng lệnh $table->string('description'); được đóng lại vì chúng ta ko xài nó nữa.

Lúc này nếu bạn chạy php artisan migrate thì sẽ nhận được thông báo "Nothing to migrate" lý do là là do bên trong table migrations đã tồn tại tên migration yyyy_mm_dd_xxxxxx_edit_tintuc_table. Để giải quyết vấn đề này, ta cần xóa dữ liệu migration yyyy_mm_dd_xxxxxx_edit_tintuc_table đi

sau đó chạy lại lệnh php artisan migration thì table news sẽ được cập nhật.

Kết quả như sau:

2.3 Xóa cột dữ liệu

Giả sử chúng ta muốn xóa cột slug đi thì hãy làm như sau. Chỉnh sửa file 2021_01_16_090806_edit_tintuc_table.php như sau:

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class EditTintucTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('tintuc', function (Blueprint $table) {
            //$table->string('description');
            //$table->renameColumn('title', 'headline');
            //$table->string('slug');
            $table->dropColumn('slug');
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('tintuc', function (Blueprint $table) {
            
        });
    }
}

Trước tiên đóng các dòng lệnh không cần thao tác lại, sau đó thêm dòng lệnh xóa cột $table->dropColumn('slug');.

Tương tự như trường hợp thay đổi cột, khi chạy lệnh php artisan migration nếu xuất hiện thông báo "Nothing to migrate." 

do đó ta cũng xử lý tương tự như trên: xóa dữ liệu migration yyyy_mm_dd_xxxxxx_edit_tintuc_table.

Chạy lại lệnh  php artisan migrate sẽ cho kết quả. Ta thấy cột slug đã được xóa.

Lời kết:

Vậy là chúng ta đã biết cách sử dụng Migration để sửa bảng (table) trong Laravel rồi đấy, đơn giản phải không nào. Chúc các bạn học tốt!

Bình luận