LaravelでWebサービス作りたいけど、データベースの作り方教えてー
OK。Laravelでマイグレーションを使用したデータベースの作り方を解説するよ!
こんにちは、エンジニアでブロガーのプロコアラです。
10年間エンジニアをしており、副業でWebサイトやWebサービスを作っています。
PHP Laravelでマイグレーションを使用してデータベースを操作する方法を解説していきます。
お知らせ
このシリーズでは、プロコアラがLaravelで作成しているWebサービス「基本情報処理クイズ」のコードを使用します。
・プログラミング言語:PHP(Laravel)+ Vue.js(Vuetify)
・データベース:MariaDB
・ローカル開発環境:Homestead
・デプロイ環境:mixhost
Laravelのローカル開発環境Homesteadの導入
ローカル開発環境のHomestead導入、MariaDBの導入は別記事で説明します。
マイグレーションって何?
マイグレーションというのはMySQLなどの特定のデータベースのコマンドを使わずにスクリプトファイルでDBを操作するやり方。
特定のデータベースの文法に依存しないため分かりやすく、データベースに依存しなくなるよ。
特定の操作だけを元に戻すということがやりやすくなるんだ。
データベースを操作するモデルを作成する
まずは、データベースを操作するモデルを作成するよ。
Laravelには便利なartisanコマンドが用意されているんだ。
アルチザンで職人という意味らしい。職人に処理を頼むという訳だね。
vagrant@homestead:~/code$ php artisan make:model Models/Test -m Model created successfully. Created Migration: 2019_05_25_195703_create_tests_table
これは、Modelsの下にTestというModelを作ってくれというコマンドになる。
-mをつけると、ついでにマイグレーションファイルも作ってくれる。
僕も上司からコピーとかお茶汲みとか色々頼まれるから、僕も職人だね。
いや、それはただの雑用係だよ。
artisan:makeで生成されるファイル
app ModelディレクトリのにTest.phpが生成される。
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Test extends Model { // }
database migrationsディレクトリにマイグレーションファイルが生成される。
2019_05_25_195703_create_tests_table.php(日付の部分は実行した日付になります)
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateTestsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('tests', function (Blueprint $table) { $table->bigIncrements('id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('tests'); } }
マイグレーションファイルを修正してテーブルを作成しよう
マイグレーションスクリプトファイルを修正して、独自のテーブルを作成してみよう。
ここでは、例としてプロコアラが作成中の基本情報クイズWebサービスで使うテストを管理するテーブルを例にして説明するよ。
カラム論理名 | カラム物理名 | 型 | 型の意味 |
ID | id | BIGINT | 連番 |
作成日 | created_at | TIMESTAMP | 日付と時刻 |
更新日 | updated_at | TIMESTAMP | 日付と時刻 |
試験名 | test_name | STRING | 文字列 |
開催日 | test_day | DATE | 日付 |
応募者数 | applicant | INTEGER | 数値 |
受験者数 | examinee | INTEGER | 数値 |
合格者数 | passed | INTEGER | 数値 |
先ほど生成したマイグレーションファイルにカラム(列)を追加する。
public function up() { Schema::create('tests', function (Blueprint $table) { $table->bigIncrements('id'); $table->timestamps(); $table->string('test_name'); $table->date('test_day'); $table->integer('applicant'); $table->integer('examinee'); $table->integer('passed'); }); }
artisanさんにお願いして作成したマイグレーションファイルに従い、マイグレーションを行ってもらう。
vagrant@homestead:~/code$ php artisan migrate Migrating: 2019_05_25_195703_create_tests_table Migrated: 2019_05_25_195703_create_tests_table
mysqlコマンドでmariaDBにアクセスする
show tablesコマンドでテーブル一覧を表示するとtestsが作成されていることが分かる。
vagrant@homestead:~/code$ mysql -u homestead -p homestead Enter password: MariaDB [homestead]> show tables; +---------------------+ | Tables_in_homestead | +---------------------+ | migrations | | password_resets | | tests | | users | +---------------------+ 4 rows in set (0.001 sec)
testsテーブルの中身を確認してみると、先ほど指定したカラムが作成されていることが分かるね。
MariaDB [homestead]> show columns from tests; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | | test_name | varchar(255) | NO | | NULL | | | test_day | date | NO | | NULL | | | applicant | int(11) | NO | | NULL | | | examinee | int(11) | NO | | NULL | | | passed | int(11) | NO | | NULL | | +------------+---------------------+------+-----+---------+----------------+ 7 rows in set (0.001 sec)
ちなみに、migrationsテーブルの中身を確認すると先ほどのマイグレーションファイルが実行されていることが分かるよ。
MariaDB [homestead]> select * from migrations; +----+------------------------------------------------+-------+ | id | migration | batch | +----+------------------------------------------------+-------+ | 1 | 2014_10_12_000000_create_users_table | 1 | | 2 | 2014_10_12_100000_create_password_resets_table | 1 | | 3 | 2019_05_25_195703_create_tests_table | 2 | +----+------------------------------------------------+-------+ 3 rows in set (0.001 sec)
マイグレーションロールバックでテーブルを元に戻す
ロールバックでテーブルを修正する方法を解説しよう。
例として、合格者、応募者数、受験者数の情報が公開されるのは時間がかかるため、Nullを許可するように変更しますね。
artisanさんでロールバックします。mariaDBからはquit;コマンドで抜けることを忘れないでね。
vagrant@homestead:~/code$ php artisan migrate:rollback Rolling back: 2019_05_25_195703_create_tests_table Rolled back: 2019_05_25_195703_create_tests_table
先ほど作成したtestsテーブルが無くなっている。
MariaDB [homestead]> show tables; +---------------------+ | Tables_in_homestead | +---------------------+ | migrations | | password_resets | | users | +---------------------+ 3 rows in set (0.001 sec)
マイグレーションファイルも無くなっています。
MariaDB [homestead]> select * from migrations; +----+------------------------------------------------+-------+ | id | migration | batch | +----+------------------------------------------------+-------+ | 1 | 2014_10_12_000000_create_users_table | 1 | | 2 | 2014_10_12_100000_create_password_resets_table | 1 | +----+------------------------------------------------+-------+ 2 rows in set (0.001 sec)
Rollbackできたので、Nullを許容するように修正する。
public function up() { Schema::create('tests', function (Blueprint $table) { $table->bigIncrements('id'); $table->timestamps(); $table->date('test_day'); $table->integer('applicant')->nullable(); $table->integer('examinee')->nullable(); $table->integer('passed')->nullable(); }); }
再度、マイグレーションしてみる
vagrant@homestead:~/code$ php artisan migrate Migrating: 2019_05_25_195703_create_tests_table Migrated: 2019_05_25_195703_create_tests_table
Nullが許容されているね。
MariaDB [homestead]> show columns from tests; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | | test_day | date | NO | | NULL | | | applicant | int(11) | YES | | NULL | | | examinee | int(11) | YES | | NULL | | | passed | int(11) | YES | | NULL | | +------------+---------------------+------+-----+---------+----------------+
テスト的にinsert intoコマンドで値を入れます。本来はプログラム上から追加します。
selectコマンドで確認すると、レコードが追加されており、Nullが許容されていることが分かります。
MariaDB [homestead]> insert into tests set passed=100, test_day='20100418'; Query OK, 1 row affected (0.005 sec) MariaDB [homestead]> select * from tests; +----+------------+------------+------------+-----------+----------+--------+ | id | created_at | updated_at | test_day | applicant | examinee | passed | +----+------------+------------+------------+-----------+----------+--------+ | 1 | NULL | NULL | 2010-04-18 | NULL | NULL | 100 | +----+------------+------------+------------+-----------+----------+--------+ 1 row in set (0.001 sec)
まとめ
マイグレーションを使用するとテーブルの修正が楽になります。
Laravelのチュートリアルとしてシリーズ化して解説していくからお楽しみに!
ではでは!