理系公務員のプログラミング日記

【Laravel6】要件の確認とLaravelの開発の基本的な進め方(ホテル予約システム1)

タグ:
Laravel
授業課題の解説

ホテルの予約システムを作ろう!

応用情報技術者令和2年秋のデータベースの問題を題材にして、Laravelでホテル予約システムを作っていきます。

バージョン:Laravel:6.20

過去問道場の該当箇所はこちら

応用情報技術者試験ドットコム 令和2年度秋期 午後問6 データベース

まずは要件定義とE-R図については、こんな感じになります。一部簡易にしています。

予約システムの主な要件

・予約システムを最初に利用する際には、氏名、住所、郵便番号を入力し、利用者登録を行う。

・利用者は空き部屋照会のための条件入力の画面上で、チェックインとチェックアウトの日付、予約したい部屋の種別と部屋数を指定して空き状況を照会する。

・予約は部屋の種別ごとに行う。

予約システムの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

ファイル名をcreate_◯◯◯◯_tableという形(〇〇〇〇はテーブル名で複数形の単語)で指定してください。

こうすることで、Laravelは必要な事項をある程度埋めたマイグレーションファイルのテンプレートを作成してくれます。

基本的にLaravelで開発を行う際は、Laravelの推奨するルールに従っておくとLaravelが色々忖度してくれて開発がスムーズに進むことが多いです。

ここでテーブル名の◯◯◯◯を複数形にするのもLaravelの推奨するルールです。複数形ではない名前をつけることは可能ですが、その場合は1つ追加で設定する必要が生じます。楽をしたいなら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テーブルに対して、その単数形のGuestモデルとします。 (

php artisan make:model Guest

モデルはテーブルから取り出したデータに対しての操作を記述できますが、とりあえずデフォルトで良いです。

Guest.php

<?php namespace App; use Illuminate\Database\Eloquent\Model; class Guest extends Model { // }

3.コントローラー(GuestController.php)を作成する。

コントローラーを作成します。Guestモデルと繋がるので、GuestControllerです。

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>

ホテル利用者一覧

これで利用者一覧を表示することができました。