Webサービス開発

LaravelからマイグレーションでMariaDBデータベースを操作する方法

student taro
見習いタロー

LaravelでWebサービス作りたいけど、データベースの作り方教えてー

koala
プロコアラ

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をつけると、ついでにマイグレーションファイルも作ってくれる。

student taro
見習いタロー

僕も上司からコピーとかお茶汲みとか色々頼まれるから、僕も職人だね。

koala
プロコアラ

いや、それはただの雑用係だよ。

 

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のチュートリアルとしてシリーズ化して解説していくからお楽しみに!

ではでは!

 

ABOUT ME
律野桜哉
RPAコンサルタントのプロコアラです。長年のエンジニア経験を活かしてして外資系コンサルファームでRPAコンサルしてます。 転職ノウハウ、プログラミング、英語の勉強方法など分かりやすいように解説していきます。