【Laravel入門】データベーステーブルとマイグレーション

次はデータベースのテーブルを作成する。ちなみにデータベースは（設定に時間がかかりそうだったので）phpmyadminであらかじめ作成しておいた。

最初にデータベースとサーバーの起動を忘れずに！（自分はMySQLとApacheを使用している。）

# テーブル作成の流れ

現在、テーブルは全く作成されていない状態である。ここから少しずつ作業を進める。作業は以下の手順で行う。

1. テーブルの下地となる``マイグレーションファイル``を生成する。
2. マイグレーションファイルにカラムの構造を書き込む。
3. データベース側にマイグレーションファイルの内容を反映させる。

# マイグレーションファイルの作成

実は、マイグレーションファイルは既に存在している。``database/migrationsディレクトリ``に以下のファイルがあるはずだ。

- 2014_10_12_000000_create_users_table.php
- 2014_10_12_100000_create_password_resets_table.php

デフォルトでユーザー認証やセキュリティのためのマイグレーションファイルが用意されているのだ。今回は使用しないので、この２つは削除する。

改めて自分でusersテーブルを作ってみよう。以下のコマンドを実行する。

```
$ php artisan make:migration create_users_table
Created Migration: 2018_04_30_111357_create_users_table
```

実行後、``database/migrationsディレクトリ``にマイグレーションファイルが作成されているはずだ。ファイル名は、タイムスタンプとコマンド時に入力した``create_users_table``で構成されている。

早速内容を見てみる。（コメントは削除した。）

```2018_04_30_111357_create_users_table.php
<?php

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

class CreateUsersTable extends Migration
{

    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('users');
    }
}

```

内容は大まかに説明するとこうだ。

- ``use文``で使用したいクラスを宣言する。
- ``CreateUsersTableクラス``は``Migrationクラス``を継承している。
- CreateUsersTableクラスには``up関数``と``down関数``がある。
- up関数の中でカラムを定義する。
- down関数の中ではテーブル削除の処理が記述されている。

さらに、カラムを構成する部分はこうだ。

- ``Schemaファザード``で``createメソッド``を使う。
- createメソッドでは、第１引数に``テーブル名のusers``、第２引数に``クロージャ``を指定する。
- クロージャでは、第１引数に``Blueprintオブジェクト``、第２引数に``$table``を指定する。
- ``Blueprintオブジェクト``のメソッドでカラムを定義する。カラムの型名が、そのままメソッド名になっている。
- メソッドの実行には``->（メソッドチェーン）``が使用される。

なお、公式ドキュメントを含めて色々調べていたら、ファザードやスキームビルダなど様々な用語が出てきて戸惑ってしまった。しかし、その都度丁寧に調べすぎていては、自分自身の学習スピードが極端に落ちてしまう。そのため、これらの記事の目的は``自分自身がLaravelの概要を理解し、後で復習できるようにするため``にしている。

細かい部分については誤りもあると思うが、寛大な心で見守っていただけるとありがたい。（さらにご指摘いただければ・・・！）

## 編集

カラム構成を、以下のように変更する。

```2018_04_30_111357_create_users_table.php
Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('email', 191)->uniqe();
    $table->string('password');
    $table->string('name');
    $table->timestamps();
});
```

``$table``に対して、カラム型名のメソッドが実行されていく。メソッドの後には``('name')``のようにカラム名を指定しよう。

カラム名をインデックスとして扱う連想配列$tableが作成されている、というイメージなのだろうか？

さらに、emailカラムの``uniqe()``はインデックスと呼ばれるものだ。他には``primary()``や``index()``などがある。

なお、インデックスに``uniqeとprimary``を指定した場合、5.5系のLaravelでは、``767バイト以下、つまり191文字数以下の文字列``しか扱えない。1文字が4バイトとして扱われるためだ。そのため、今回はstringメソッドの第２引数として文字数を指定しなければならなかった。詳しくは以下の記事をご覧いただきたい。

[Laravel5.4 + MySQL5.5.9 でusersテーブルのマイグレーション時に Syntax error](https://qiita.com/beer_geek/items/6e4264db142745ea666f)

# マイグレーションの実行

マイグレーションファイルを作成したので、早速データベースに反映させよう。

```
$ php artisan migrate
Migration table created successfully.
Migrating: 2018_04_30_111357_create_users_table
Migrated:  2018_04_30_111357_create_users_table
```

phpmyadminを起動させていれば、テーブルの構造が簡単に確認できるだろう。なお、作成した覚えのない``created_at``カラムと``updated_at``カラムは、``timestampsメソッド``を実行すると自動的に作成されるものだ。

データベースの構造を表示するartisanコマンドが見当たらなかったので、phpmyadminをインストールしていない場合は、各データベースにログインし、そこで構造を見てみよう。

以下に、一例としてMySQLの確認方法を記載する。

```
$ mysql -u データベースのユーザー名 -D データベース名 -p
Enter password: 

mysql> show tables;
+--------------------+
| Tables_in_testlara |
+--------------------+
| migrations         |
| users              |
+--------------------+
2 rows in set (0.00 sec)

mysql> desc users;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| email      | varchar(191)     | NO   |     | NULL    |                |
| password   | varchar(255)     | NO   |     | NULL    |                |
| name       | varchar(255)     | NO   |     | NULL    |                |
| created_at | timestamp        | YES  |     | NULL    |                |
| updated_at | timestamp        | YES  |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

mysql> desc migrations;
+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| id        | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| migration | varchar(255)     | NO   |     | NULL    |                |
| batch     | int(11)          | NO   |     | NULL    |                |
+-----------+------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> \q
Bye
```

作成した覚えのない``migrationsテーブル``が存在しているが、これはマイグレーションの初回実行時に自動的に作成されるテーブルだ。``migrationカラム``には、今回マイグレーションを実行したファイル名である``2018_04_30_111357_create_users_table``が入っている。

# ロールバックによるテーブル削除

もしテーブルを削除したい場合は、ロールバックを行い今までのマイグレーションの実行を無かったことにする。決して``テーブルを直接削除するためのコマンド``を実行する訳ではないのだ。

```
$ php artisan migrate:rollback
Rolling back: 2018_04_30_111357_create_users_table
Rolled back:  2018_04_30_111357_create_users_table
```

これでusersテーブルは消える。さらに、migrationsテーブルのmigrationカラムからも``2018_04_30_111357_create_users_table``のレコードが消える。

# up関数とdown関数

ここで、クロージャに``up関数とdown関数``が存在していたことを思い出していただきたい。そして、``down関数``には以下の記述がされている。

```
Schema::dropIfExists('users');
```

この``dropIfExists``は、引数である``users``テーブルが存在していた場合、それを削除するメソッドだ。

要は、ロールバックは``down関数``を実行するコマンドなのだ。逆に、マイグレーション実行時には``up関数``が実行される。

以下に、up関数とdown関数が各々実行されるコマンドを記載しておく。

## up関数を実行
作成したマイグレーションファイルが全て実行される。

```
php artisan migrate
```

## down関数を実行

``最後に``実行したマイグレーションファイルが戻される。

```
php artisan migrate:rollback
```

``stepオプション``で巻き戻す回数も指定できる。

```
php artisan migrate:rollback --step=5
```

``全て``実行したマイグレーションファイルが戻される。

```
php artisan migrate:reset
```

up関数とdown関数には、それぞれ真逆の処理を書いておけば良いということだろうか？

とりあえず今回はここまで。