最新ソースはこちら
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はこれら、データベースへのアクセスが簡単だからいいよね。



