「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アプリケーションなら作れそうな状態になりました。
もしかしたら、少しカスタマイズ的な話に続くかもしれません。