LaravelのEloquent ORマッパーを使ってデータベースアクセスの実装

Laravel入門中。コントローラとビューを使ってみる。」の続きです。
Laravelで、HTTPレスポンスの返送ができるようになりました。あとは、データベースの読み書きができれば、Webアプリケーションが作れます。

データベースの設定

Laravelの環境設定は、 .env というファイルに記述されています。これを環境ごとに書き分けることで、本番用と開発用で別のデータベースに接続したりできます。

$ cat .env | grep 'DB_'
DB_HOST=localhost
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

データベースに関する設定はこのあたりです。テキトーに自分のローカル環境の設定に合わせて書き換えます。
ちなみに、実際の設定は下記の config/database.php に記述されていて、この .env ファイルを読み込む形になっています。こちらを書き換える必要はありません。

$ cat config/database.php
 [
// ...
        'mysql' => [
            'driver'    => 'mysql',
            'host'      => env('DB_HOST', 'localhost'),
            'database'  => env('DB_DATABASE', 'forge'),
            'username'  => env('DB_USERNAME', 'forge'),
            'password'  => env('DB_PASSWORD', ''),
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
        ],
// ...
    ],
// ...
];

これでLaravelからデータベースに接続できる状態になりました。

モデルクラスの作成

今までは、ViewとControllerだけでしたが、ついにMVCのMを導入します。
artisanコマンドのmake:modelで、スケルトンを自動生成してくれます。

$ php artisan make:model User
Model already exists!

まさかのエラー。
Userというモデルは、実は初期プロジェクトに、勝手に作られています。1から作ってみたいので、1回作成済みのUser.phpを削除して、新たに作り直します。

$ rm app/User.php
$ php artisan make:model User
Model created successfully.

中身はこんな感じです。

EloquentのModelクラスを継承しているだけでした。
ちなみに、Eloquentというのが、LaravelのORマッパーです。

データベースの定義の作成

クラスは作成したものの、まだテーブルを作成していませんでした。
テーブルの定義は、マイグレーションという形で記述していきます。マイグレーションはテーブルに更新を加えるたびに追記していく形で、必要に応じてロールバックすることもできます。

$ php artisan make:migration create_user_table
Created Migration: 2015_12_20_102007_create_user_table

ちなみに、下記のように -m オプションを付けてモデルを作成すると、マイグレーションも同時に作成されるようです。

$ php artisan make:model -m User
Model created successfully.
Created Migration: 2015_12_20_102038_create_users_table

最初にたくさん準備するときは楽かも。

マイグレーションを記述

生成されたファイルはこんな形になっています。

increments('id');
            $table->timestamps();
        });
    }
// ...
    public function down()
    {
        Schema::drop('users');
    }
}

通常はupメソッドの内容を実行してテーブルの追加や更新をしていきます。いざというときにロールバックするために、downメソッドも書いておくと、テーブルの定義を行ったり来たりすることもできます。
usersテーブルを作成するときに、nameカラムとageカラムを作成するように記述しておきます。

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->integer('age');
    $table->timestamps();
});

これでテーブルが作成できるはず、です。

マイグレーションの実行

記述したファイルを元にテーブルの追加・更新をおこなう場合は、artisanのmigrateコマンドを実行します。

$ php artisan migrate

すると・・・。

[PDOException]
SQLSTATE[HY000] [1049] Unknown database 'laravel'

エラーになりました。
マイグレーションにデータベースの作成に関して書かれていないので、考えてみたら当然です。
mysqlシェルにログインしてデータベースを作成しておきます。

mysql> create database laravel charset=utf8;
Query OK, 1 row affected (0.02 sec)

改めてマイグレーションを実行すると今度は成功しました。

$ php artisan migrate
Migrated: 2015_12_20_102038_create_users_table

これでテーブル作成完了です!

作成されたテーブルを確認

さっそくテーブルがどうなっているか確認してみます。
usersテーブルが作成されていて、併せてmigrationsというテーブルも作られています。

mysql> show tables;
+-------------------+
| Tables_in_laravel |
+-------------------+
| migrations        |
| users             |
+-------------------+
2 rows in set (0.00 sec)

migrationsはテーブルの更新を実行したりロールバックしたりする際に、どこまでを実行したかを管理しています。

mysql> select * from migrations;
+--------------------------------------+-------+
| migration                            | batch |
+--------------------------------------+-------+
| 2015_12_20_102038_create_users_table |     1 |
+--------------------------------------+-------+
1 row in set (0.00 sec)

usersテーブルのほうは想定どおりに、nameカラムとageカラムつきで作成されていました。

mysql> desc users;
+------------+------------------+------+-----+---------------------+----------------+
| Field      | Type             | Null | Key | Default             | Extra          |
+------------+------------------+------+-----+---------------------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL                | auto_increment |
| name       | varchar(255)     | NO   |     | NULL                |                |
| age        | int(11)          | NO   |     | NULL                |                |
| created_at | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
| updated_at | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
+------------+------------------+------+-----+---------------------+----------------+
5 rows in set (0.02 sec)

HTTPリクエストでDBアクセスしてみる

こうして、モデルクラスを作り、テーブルを作成したら、実際にHTTPリクエストした際にDBアクセスを発火させてみたくなります。
Userモデルは特に記述をしていませんが、Eloquentの機能で、既にデータベースアクセスができる状態になっています。
UserController.php にユーザーの一覧取得処理を実装します。

public function index()
{
    $users = User::all();
    return view('users/index', compact('users'));
}

これでデータを取れるようになります!
でもまだテーブルは空なので、テキトーに書き込みをする処理も入れてしまいます。

public function index()
{
    $user = new User;
    $user->name = md5(rand());
    $user->age = rand(0,100);
    $user->save();
    $users = User::all();
    return view('users/index', compact('users'));
}
FireShot Capture 58 -  - http___localhost_8000_users

そしてページを開くと!

リロードするたびに新しいレコードが作成され、表示が増えていきます!

続く?

これでLaravelの最も基本的な使い方は理解でき、簡単なWebアプリケーションなら作れそうな状態になりました。
もしかしたら、少しカスタマイズ的な話に続くかもしれません。

タイトルとURLをコピーしました