LoginSignup
67
73

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-30

次はデータベースのテーブルを作成する。ちなみにデータベースは(設定に時間がかかりそうだったので)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

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

改めて自分で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メソッドでは、第1引数にテーブル名のusers、第2引数にクロージャを指定する。
  • クロージャでは、第1引数にBlueprintオブジェクト、第2引数に$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メソッドの第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関数には、それぞれ真逆の処理を書いておけば良いということだろうか?

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

67
73
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
67
73