【Laravel6】要件の確認とLaravelの開発の基本的な進め方(ホテル予約システム1)
ホテルの予約システムを作ろう!
応用情報技術者令和2年秋のデータベースの問題を題材にして、Laravelでホテル予約システムを作っていきます。
過去問道場の該当箇所はこちら
応用情報技術者試験ドットコム 令和2年度秋期 午後問6 データベース
まずは要件定義とE-R図については、こんな感じになります。一部簡易にしています。
予約システムの主な要件
・予約システムを最初に利用する際には、氏名、住所、郵便番号を入力し、利用者登録を行う。
・利用者は空き部屋照会のための条件入力の画面上で、チェックインとチェックアウトの日付、予約したい部屋の種別と部屋数を指定して空き状況を照会する。
・予約は部屋の種別ごとに行う。
予約システムのE-R図
Laravelの開発の基本的な進め方
要件定義によって作成されたE-R図に従い作成していきます。1つのテーブル(表)に対して、
テーブル → モデル(Model) → コントローラー(Controller) → (ルーティング) → ビュー(View) の順に作成していくと良いでしょう。
以下では、一番簡単な利用者テーブルの作成から全利用者の表示を行ってみます。
1.E-R図に従ってテーブルをマイグレーションファイル(create_guests_table.php)で作成する。
php artisan make:migration create_guests_table
ファイル名を
こうすることで、Laravelは必要な事項をある程度埋めたマイグレーションファイルのテンプレートを作成してくれます。
基本的にLaravelで開発を行う際は、Laravelの推奨するルールに従っておくとLaravelが色々忖度してくれて開発がスムーズに進むことが多いです。
ここで
上記のコマンドで作成したマイグレーションファイルに、下記のように追記を行います。
create_guests_table.php
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateGuestsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('guests', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('address'); $table->string('tel'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('guests'); } }
入力が完了すれば、マイグレーションを実行します。
php artisan migrate
1.1 ダミーデータをSeeder(GuestsTableSeeder.php)で作成する。
Seederはテーブルに対してダミーデータを追加することができます。
利用方法はまず下記のコマンドで生成して、
php artisan make:seeder GuestsTableSeeder
run()メソッド内に、テーブルに追加したい内容を記載し、
GuestsTableSeeder.php
<?php use Illuminate\Database\Seeder; class GuestsTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $param = [ 'name' => '大阪たろう', 'address' => '大阪府大阪市', 'tel' => '12-3456-7890' ]; DB::table('guests')->insert($param); $param = [ 'name' => '京都はなこ', 'address' => '京都府京都市', 'tel' => '12-3456-7890' ]; DB::table('guests')->insert($param); } }
DatabaseSeeder.phpに今書いたファイル名を登録します。
DatabaseSeeder.php
<?php use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { /** * Seed the application's database. * * @return void */ public function run() { $this->call(GuestsTableSeeder::class); } }
最後にターミナルでSeederを実行します。
php artisan db:seed
2.モデル(GuestModel.php)を作成する。
どんどん行きましょう。次はモデルを追加します。
Guestsテーブルに対して、その
php artisan make:model Guest
モデルはテーブルから取り出したデータに対しての操作を記述できますが、とりあえずデフォルトで良いです。
Guest.php
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Guest extends Model { // }
3.コントローラー(GuestController.php)を作成する。
コントローラーを作成します。Guestモデルと繋がるので、
php artisan make:controller GuestController
GuestController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Guest; class GuestController extends Controller { public function index() { $guests = Guest::all(); return view('guest.index',['guests' => $guests]); } }
3.1 コントローラーにルーティング(web.php)を指定する。
web.php
Route::get('/guest','GuestController@index');
4.ビュー(guest/index.blade.php)を作成する。
めちゃくちゃシンプルですが、全ページで利用できるレイアウトを作ります。 (あとで変更するかも)
layouts/hotel.blade.php
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>APホテル</title> <style> body { color: #333333; background-color: #FFFFFF; font-size: 100%; line-height: 1.7; margin: 10px auto; width: 90%; -webkit-text-size-adjust: 100%; } a { text-decoration: none; } .main-nav { display: flex; font-size: 1.25rem; text-transform: uppercase; list-style: none; } .main-nav li { margin-left: 36px; } </style> </head> <body> <header> <h1>APホテル</h1> <nav> <ul class="main-nav"> <li><a href="/guest">利用者一覧</a></li> <li><a href="/reserve">予約一覧</a></li> </ul> <ul class="main-nav"> <li><a href="/guest/add">利用者一覧</a></li> <li><a href="/reserve/add">予約一覧</a></li> </ul> </nav> </header> <body> @yield('body') </body> </body> </html>
これを継承して利用者一覧画面を表示します。
guest/index.blade.php
@extends('layouts.hotel') @section('body') <table> <th>お名前</th><th>ご住所</th><th>電話番号</th> @foreach($guests as $guest) <tr> <td>{{$guest->name}}</th> <td>{{$guest->address}}</td> <td>{{$guest->tel}}</th> </tr> @endforeach </table> @endsection <style> table{ width: 80%; border-collapse: collapse; border-spacing: 0; } table th, table td{ padding: 10px 0; text-align: center; } table tr:nth-child(odd){ background-color: #eee; } </style>
これで利用者一覧を表示することができました。