Laravel5.5LTS、AtoZ#4、データベースとマイグレーション
タグ: Laravel5.5
Laravelを一通り経験しようシリーズ4段目です。今回は、データベースを準備し、データベースとテーブルの構造を管理するマイグレーションを試してみましょう。
DBの準備
認証で作成されるユーザー情報は、データベースへ保存されます。今回はデフォルト設定に従いMySQLを使用します。もちろん、Homestead環境では準備済みです。
プロジェクトルートの.envファイルの中身を確認しましょう。データベースの接続設定があります。
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret
Laravelでは、環境設定などはconfigディレクトリ下の設定ファイルで定義するお約束になっています。そうしたファイルに用意されている設定項目のうち、開発環境とデプロイ後の実働環境で変更になりやすい項目については、.envファイル内から設定内容を読み込むようになっています。
実際には、直接.envファイルをアクセスしているわけでありません。.envで定義された内容はシェルの環境変数として設定されます。その環境変数をLaravel起動時に読み込みます。これにより、たとえばWebサーバーの設定や、Webサーバーの死活管理を行うプログラムでも、値を指定できるようになっています。それにより、よりセキュアにアプリを運営できるようになっています。(Homestead環境ではWebサーバーの死活管理は行われていません。)
Homestead環境では、MySQLのルートユーザーはhomesteadで、パスワードはsecretです。それが既に設定済みです。homesteadデータベースもデフォルトで用意されています。Homesteadでホストするサイトが1つだけの場合は、これを利用しても良いでしょう。通常は、サイトに合わせてわかりやすい名前をデータベースに付けます。
今回は、新たにinstallデータベースを作成し、それを利用します。そのため、DB_DATABASE項目を変更します。
DB_DATABASE=install
installデータベースはMySQLデータベースエンジンに、まだ用意されていません。自分で作成する必要があります。
もし、PHPMyAdminをインストール済みであれば、それを利用して作成してください。もしくは、MySQLコマンド(SQL)を直接実行し、テーブルを作成します。
mysql -u homestead -psecret -e 'CREATE DATABASE install DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci'
installデータベースをデフォルトのキャラクターをutf8mb4で、コレーションをutf8mb4_general_ciで作成します。install部分がテーブルの名前です。他のテーブル名を使用する場合は、変更してください。
マイグレーション
マイグレーションは、データベースの構造(スキーマ)を管理する仕組みです。ベータベースに対し、テーブルを作成/削除したり、構造を追加/削除したりする定義と、逆にその変更を取り消す定義を行い、それに従ってテーブルを変更します。
現在のLaravelのマイグレーション定義は、PHPのクラスの中に記述しています。
構造変更を取り消せると言うメリットの他に、主に2つの利便性があります。一つはチーム開発で変更を他のメンバーと共有できること、もう一つはPHPクラスで定義すると言うことはテキストファイルですので、簡単にソースコントロール下に置けます。
マイグレーションクラスは、database/migrationsディレクトリ下に設置されています。ファイル名には日時が先頭につけてあります。マイグレーションを正しく行うには、定義した順番に実行する必要があるためです。
ファイルを開き、クラスの中を見てみると、構造を変化させるup関数と、その変化を取り消すdown関数の2つが定義されています。
インストール時には、usersテーブル作成とpassword_resetsテーブル作成の2つのマイグレーションが用意されています。
試しに実行してみましょう。
php artisan migrate
これにより、未実行のマイグレーションがまとめて一気に実行されます。テーブルができているかPHPMyAdminで確認するか、もしくは以下のコマンドを実行してみましょう。
mysql -u homestead -psecret -e 'SHOW TABLES FROM install'
installデータベース中のテーブルが全部表示されます。実行結果を確認しましょう。
| Tables_in_install | 
|---|
| migrations | 
| password_resets | 
| users | 
usersとpassword_resetsテーブルができています。migrationsテーブルは、Laravelがどのマイグレーションを実行しているのかなど、管理に使用するテーブルです。マイグレーションを実行すると、Laravelが自動的に作成します。
mysql -u homestead -psecret -e 'SHOW COLUMNS FROM migrations IN install'
実行結果
| 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 | 
肝心のusersとpassword_resetsテーブルの構造も、確認しておきましょう。
mysql -u homestead -psecret -e 'SHOW COLUMNS FROM users IN install'
実行結果
| Field | Type | Null | Key | Default | Extra | 
|---|---|---|---|---|---|
| id | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| name | varchar(255) | NO | NULL | ||
| varchar(255) | NO | UNI | NULL | ||
| password | varchar(255) | NO | NULL | ||
| remember_token | varchar(100) | YES | NULL | ||
| created_at | timestamp | YES | NULL | ||
| updated_at | timestamp | YES | NULL | 
mysql -u homestead -psecret -e 'SHOW COLUMNS FROM password_resets IN install'
実行結果
| Field | Type | Null | Key | Default | Extra | 
|---|---|---|---|---|---|
| varchar(255) | NO | MUL | NULL | ||
| token | varchar(255) | NO | NULL | ||
| created_at | timestamp | YES | NULL | 
テーブルの実際の構造と、マイグレーションクラス中のup関数の定義を見比べてください。すぐにどのように定義すればよいか、勘がつかめるでしょう。うっすらとでも、使い方がわかったら、後はドキュメントを読んで理解できます。