Thay đổi Migration

Thay đổi Migration

  • Bài này sẽ tiếp theo bài tạo table với Migration, nếu chưa biết Migration là gì hay cách hoạt động Migration ra sao thì bạn xem lại nhé.
  • Để thêm dữ liệu Migration ta có thể thực hiện drop 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. Cách làm này đơn giản nhưng chỉ thực hiện được với table mới, chưa có nội dung.
  • Còn đối với table đã có nội dung, thì việc thực hiện cũng không quá khó, ta tạo một Migration mới dành riêng cho việc thay đổi như sau: tạo file Migration edit_news_table.php
php artisan make:migration edit_news_table

Tạo một Migration

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

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

class EditNewsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        //
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //
    }
}
  • Ta thấy nội dung tương tự như tạo file create_news_table.php, nhưng 2 function up()down() đang là rỗng.

Thêm cột dữ liệu

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

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

class EditNewsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('news', function (Blueprint $table) {
            $table->string('description');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //
    }
}
  • 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:

Tạo một Migration

  • Kiểm tra lại bảng news trên phpMyAdmin sẽ thấy kết quả:

Tạo một Migration

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

  • Để thay đổi được dữ liệu VD 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:
composer require doctrine/dbal
  • Kết quả như sau là cài đặt thư viện Doctrine/dbal thành công:

Tạo một Migration

  • Giả sử 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_news_table.php như sau:
<?php

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

class EditNewsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('news', function (Blueprint $table) {
            //$table->string('description');
            $table->renameColumn('headline', 'title');
            $table->string('slug');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //
    }
}
  • Bên trên ta đã đóng dòng lệnh //$table->string('description');, vì đã không còn thao tác gì dòng lệnh này.
  • Tuy nhiên lúc này khi chạy lệnh php artisan migration thì sẽ xuất hiện thông báo "Nothing to migrate.":

Tạo một Migration

  • Điều này là do bên trong table migrations đã tồn tại tên migration yyyy_mm_dd_xxxxxx_edit_news_table:

Tạo một Migration

  • Để giải quyết vấn đề này, ta cần xóa dữ liệu migration yyyy_mm_dd_xxxxxx_edit_news_table đi, sau đó chạy lại lệnh php artisan migration thì table news sẽ được cập nhật.

Tạo một Migration

Tạo một Migration

Tạo một Migration

Xóa dữ liệu

  • Giả sử ta cần xóa cột slug, ta tiến hành thay đổi file edit_news_table.php như sau:
<?php

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

class EditNewsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('news', function (Blueprint $table) {
            //$table->string('description');
            //$table->renameColumn('title', 'headline');
            //$table->string('slug');
            $table->dropColumn('slug');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //
    }
}
  • 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_news_table.
  • Chạy lại lệnh php artisan mygration sẽ cho kết quả.

Tạo một Migration

  • Ta thấy cột slug đã được xóa.