Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Laravel】Migrationによるカラムの更新

PHPバージョン:7.1.14
Laravelバージョン:5.7.9

Migrationでデータベースカラムを更新をする場合は、
composerで外部パッケージを導入しておかなければなりません


doctrine/dbalパッケージの導入

コンソールでcomposerコマンドを実行しdoctrine/dbalというパッケージを導入

$ composer require doctrine/dbal

実行結果はこちら

$ composer require doctrine/dbal
Using version ^2.8 for doctrine/dbal
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 3 installs, 0 updates, 0 removals
  - Installing doctrine/event-manager (v1.0.0): Downloading (100%)         
  - Installing doctrine/cache (v1.8.0): Downloading (100%)         
  - Installing doctrine/dbal (v2.8.0): Downloading (100%)         
doctrine/cache suggests installing alcaeus/mongo-php-adapter (Required to use legacy MongoDB driver)
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
Discovered Package: beyondcode/laravel-dump-server
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.

Package manifest generated successfully.
と最後に表示されれば成功です。

composer.jsonファイルからも確認できます。

"require": {
        "php": "^7.1.3",
        <b>"doctrine/dbal": "^2.8",</b>
        "fideloper/proxy": "^4.0",
        "laravel/framework": "5.7.*",
        "laravel/tinker": "^1.0"
    },

composer.json

requireに"doctrine/dbal"というパッケージが追記されています。

Migrationによるデータベースカラムの更新

以下のコマンドを実行すると、
データベースカラムの更新用Migrationファイルが作成されます。

$ php artisan make:migration add_column_body_articles_table --table=articles
Created Migration: 2018_11_05_072111_add_column_body_articles_table

Migrationファイルが作成されました!

<?php

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

class AddColumnBodyArticlesTable extends Migration
{
    public function up()
    {
        Schema::table('articles', function (Blueprint $table) {
            $table->string('body');
        });
    }

    public function down()
    {

    }
}

databases>migrations>xxxxxx_add_column_body_articles_table.php

upメソッド内で、
Blueprintオブジェクトの$tableを使い、
string型のbodyメソッドを追加しました。

それではMigrateを実行します。

$ php artisan migrate
Migrating: 2018_11_05_072111_add_column_body_articles_table
Migrated:  2018_11_05_072111_add_column_body_articles_table

MySQLで確認します。

mysql> show columns from articles;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| title      | varchar(255)     | NO   |     | NULL    |                |
| created_at | timestamp        | YES  |     | NULL    |                |
| updated_at | timestamp        | YES  |     | NULL    |                |
| body       | varchar(255)     | NO   |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

無事bodyカラムが追加されました。

続いてロールバックを実行してみます。

$ php artisan migrate:rollback
Rolling back: 2018_11_05_072111_add_column_body_articles_table
Rolled back:  2018_11_05_072111_add_column_body_articles_table

MySQLを確認します。

mysql>  show columns from articles;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| title      | varchar(255)     | NO   |     | NULL    |                |
| created_at | timestamp        | YES  |     | NULL    |                |
| updated_at | timestamp        | YES  |     | NULL    |                |
| body       | varchar(255)     | NO   |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

結果は…ロールバックできていません!
add_column_price_event_tableのMigrationファイルのdownメソッドに
ロールバック用の記述が無いからです!

    public function down()
    {
        Schema::table('articles', function (Blueprint $table) {
            $table->dropColumn('body');
        });
    }

xxxxxx_add_column_body_articles_table.php

カラム削除はdropColumnメソッドで実行します。
それではまずはMigrationを全く実行していない状態にしましょう。

$ php artisan migrate:reset;

migrate:resetで、全Migrationをロールバックすることができます!

それではもう一度migrateした後、
add_column_body_articles_tableのMigrationのみをロールバックします。

$ php artisan migrate
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
Migrating: 2018_11_05_053713_create_articles_table
Migrated:  2018_11_05_053713_create_articles_table
Migrating: 2018_11_05_072111_add_column_body_articles_table
Migrated:  2018_11_05_072111_add_column_body_articles_table

$ php artisan migrate:rollback --step=1
Rolling back: 2018_11_05_072111_add_column_body_articles_table
Rolled back:  2018_11_05_072111_add_column_body_articles_table

ロールバックのオプションにstepを指定すると、
指定した数値分のMigrationファイルだけロールバックします。

それではMySQLで、
ロールバックによりbodyカラムが削除されているか確認しましょう。

mysql>  show columns from articles;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| title      | varchar(255)     | NO   |     | NULL    |                |
| created_at | timestamp        | YES  |     | NULL    |                |
| updated_at | timestamp        | YES  |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

無事ロールバックされていました!

今回はここまでです、ありがとうございました〜