「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'));
}

そしてページを開くと!
リロードするたびに新しいレコードが作成され、表示が増えていきます!
続く?
これでLaravelの最も基本的な使い方は理解でき、簡単なWebアプリケーションなら作れそうな状態になりました。
もしかしたら、少しカスタマイズ的な話に続くかもしれません。

