最新ソースはこちら
https://github.com/takishita2nd/hotel-mng
TechCommitの課題で、予約管理を行うツールを作成すえうということで、Laravelで作成してみようと思いまして。
まずはデータベースの作成から着手。
イメージはこんな感じ。
使用する部屋は1つという条件があるので、そんなに複雑にしなくてもいい。
だが、予約が空いている日、埋まっている日が簡単にわかるように、予約が入っている日を管理できるテーブルも追加する。
Laravelでデータベースを作成するマイグレーションファイルを作成する。
$ php artisan make:migration create_reserve_management
中身はこんな感じ。
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateReserveManagement extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('reserve_managements', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('address'); $table->string('phone'); $table->integer('days'); $table->date('start_day'); $table->timestamps(); $table->engine = 'InnoDB'; $table->charset = 'utf8mb4'; $table->collation = 'utf8mb4_unicode_ci'; }); Schema::create('reserve_day_lists', function (Blueprint $table) { $table->increments('id'); $table->date('day'); $table->timestamps(); $table->engine = 'InnoDB'; $table->charset = 'utf8mb4'; $table->collation = 'utf8mb4_unicode_ci'; }); Schema::create('reserve_day_lists_reserve_managements', function (Blueprint $table) { $table->increments('id'); $table->integer('reserve_managements_id') ->foreign('reserve_managements_id') ->references('id')->on('reserve_managements') ->onDelete('cascade'); $table->integer('reserve_day_lists_id') ->foreign('reserve_day_lists_id') ->references('id')->on('reserve_day_lists') ->onDelete('cascade'); $table->timestamps(); $table->engine = 'InnoDB'; $table->charset = 'utf8mb4'; $table->collation = 'utf8mb4_unicode_ci'; }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('reserve_day_lists_reserve_managements'); Schema::dropIfExists('reserve_day_lists'); Schema::dropIfExists('reserve_managements'); } }
あとで微調整はする。
コメント無くてすまぬ。
これらは色々試行錯誤した結果なので、あとで直すかもしれない。
最新のコードはgitを参照していただきたい。
Schema::create()を使って、3つのテーブルを作成している。
1つめが予約管理、その次が予約日管理、最後に中間テーブル。
中間テーブルからは各管理テーブルを紐付けるように外部参照キーを設定している。
で、このテーブルを扱うために、モデルを作成する。
$ php artisan make:model reserve_management
これでモデルのベースが作成される。
整理のためにディレクトリは移動しているが、一個作ればそれをベースにして複製すればよい。
各管理テーブルからは以下のような関数を追加する。
public function hasDayListAndManagement() { return $this->belongsTo('App\Model\reserve_day_lists_reserve_managements', 'id', 'reserve_managements_id'); }
これで、管理テーブルから中間テーブルをリレーションすることができる。
逆に、中間テーブルから管理テーブルには、
public function hasManagement() { return $this->hasMany('App\Model\reserve_management', 'id', 'reserve_managements_id'); } public function hasDayList() { return $this->hasMany('App\Model\reserve_day_list', 'id', 'reserve_day_lists_id'); }
と、すれば、参照できるようになる。
試しに、以下のコマンドを実行する。
$ php artisan tinker $test = App\Model\reserve_day_list::first() => App\Model\reserve_day_list {#2912 id: 1, day: "2019-10-10", created_at: "2019-11-20 00:52:20", updated_at: "2019-11-20 00:52:20", } $test2 = $test->hasDayListAndManagement() => Illuminate\Database\Eloquent\Relations\BelongsTo {#2904} $test2->get() => Illuminate\Database\Eloquent\Collection {#2897 all: [ App\Model\reserve_day_lists_reserve_managements {#2911 id: 1, reserve_managements_id: 1, reserve_day_lists_id: 1, created_at: "2019-11-20 00:52:56", updated_at: "2019-11-20 00:52:56", }, ], } $test2->first()->hasManagement()->get() => Illuminate\Database\Eloquent\Collection {#2923 all: [ App\Model\reserve_management {#2915 id: 1, name: "aaa", address: "bbb", phone: "ccc", days: 2, start_day: "2019-10-10", created_at: "2019-11-20 00:51:46", updated_at: "2019-11-20 00:51:46", }, ], }
これで、予約日管理テーブルから予約管理テーブルを参照することができた。
逆に、予約管理テーブルから予約日管理テーブルを参照する。
$test = App\Model\reserve_management::first() => App\Model\reserve_management {#2912 id: 1, name: "aaa", address: "bbb", phone: "ccc", days: 2, start_day: "2019-10-10", created_at: "2019-11-20 00:51:46", updated_at: "2019-11-20 00:51:46", } $test2 = $test->hasDayListAndManagement() => Illuminate\Database\Eloquent\Relations\BelongsTo {#2904} $test2->first()->hasDayList()->get() => Illuminate\Database\Eloquent\Collection {#2899 all: [ App\Model\reserve_day_list {#2911 id: 1, day: "2019-10-10", created_at: "2019-11-20 00:52:20", updated_at: "2019-11-20 00:52:20", }, ], }
できました。
Laravelはこれら、データベースへのアクセスが簡単だからいいよね。