次はデータベースのテーブルを作成する。ちなみにデータベースは(設定に時間がかかりそうだったので)phpmyadminであらかじめ作成しておいた。
最初にデータベースとサーバーの起動を忘れずに!(自分はMySQLとApacheを使用している。)
テーブル作成の流れ
現在、テーブルは全く作成されていない状態である。ここから少しずつ作業を進める。作業は以下の手順で行う。
- テーブルの下地となる
マイグレーションファイル
を生成する。 - マイグレーションファイルにカラムの構造を書き込む。
- データベース側にマイグレーションファイルの内容を反映させる。
マイグレーションファイルの作成
実は、マイグレーションファイルは既に存在している。database/migrationsディレクトリ
に以下のファイルがあるはずだ。
- 2014_10_12_000000_create_users_table.php
- 2014_10_12_100000_create_password_resets_table.php
デフォルトでユーザー認証やセキュリティのためのマイグレーションファイルが用意されているのだ。今回は使用しないので、この2つは削除する。
改めて自分でusersテーブルを作ってみよう。以下のコマンドを実行する。
$ php artisan make:migration create_users_table
Created Migration: 2018_04_30_111357_create_users_table
実行後、database/migrationsディレクトリ
にマイグレーションファイルが作成されているはずだ。ファイル名は、タイムスタンプとコマンド時に入力したcreate_users_table
で構成されている。
早速内容を見てみる。(コメントは削除した。)
<?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メソッドでは、第1引数に
テーブル名のusers
、第2引数にクロージャ
を指定する。 - クロージャでは、第1引数に
Blueprintオブジェクト
、第2引数に$table
を指定する。 -
Blueprintオブジェクト
のメソッドでカラムを定義する。カラムの型名が、そのままメソッド名になっている。 - メソッドの実行には
->(メソッドチェーン)
が使用される。
なお、公式ドキュメントを含めて色々調べていたら、ファザードやスキームビルダなど様々な用語が出てきて戸惑ってしまった。しかし、その都度丁寧に調べすぎていては、自分自身の学習スピードが極端に落ちてしまう。そのため、これらの記事の目的は自分自身がLaravelの概要を理解し、後で復習できるようにするため
にしている。
細かい部分については誤りもあると思うが、寛大な心で見守っていただけるとありがたい。(さらにご指摘いただければ・・・!)
編集
カラム構成を、以下のように変更する。
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メソッドの第2引数として文字数を指定しなければならなかった。詳しくは以下の記事をご覧いただきたい。
Laravel5.4 + MySQL5.5.9 でusersテーブルのマイグレーション時に Syntax error
マイグレーションの実行
マイグレーションファイルを作成したので、早速データベースに反映させよう。
$ 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関数には、それぞれ真逆の処理を書いておけば良いということだろうか?
とりあえず今回はここまで。