前回までの様子はこちら。
最新ソースコードはこちら。
https://github.com/takishita2nd/hotel-mng
まずは、テーブルの連携が正しくできるように、マイグレーションを修正しました。
実際に修正を行う際には、事前にロールバックを行うか、テーブルを書き換えるマイグレーションファイルを追加してください。
Schema::create('reserve_day_list_reserve_management', function (Blueprint $table) {
$table->increments('id');
$table->integer('reserve_management_id')
->foreign('reserve_management_id')
->references('id')->on('reserve_managements')
->onDelete('cascade');
$table->integer('reserve_day_list_id')
->foreign('reserve_day_list_id')
->references('id')->on('reserve_day_lists')
->onDelete('cascade');
$table->timestamps();
$table->engine = 'InnoDB';
$table->charset = 'utf8mb4';
$table->collation = 'utf8mb4_unicode_ci';
});
Laravelには、中間テーブルのネーミングルールが決まっており、それに合わないと、正しく中間テーブルを認識できません。
しかし、ネーミングルールがあっていれば、中間テーブルのモデルを定義しなくても、Laravelは中間テーブルを認識します。
各モデルの関数も修正します。
class ReserveManagement extends Model
{
protected $table = 'reserve_managements';
public function reserveDayLists()
{
return $this->belongsToMany('App\Model\ReserveDayList');
}
}
class ReserveDayList extends Model
{
protected $table = 'reserve_day_lists';
public function reserveManagements()
{
return $this->belongsToMany('App\Model\ReserveManagement');
}
}
これで、各モデルから連携先のモデルを直接参照することができます。
最後にリポジトリの修正を行います。
public function add($param)
{
$model = new ReserveManagement;
foreach($this->paramNames as $name)
{
$model->$name = $param[$name];
}
$model->save();
$model2 = new ReserveDayList();
$model2->day = $model->start_day;
$model2->save();
$model->reserveDayLists()->attach($model2);
for($i = 1; $i < $model->days; $i++)
{
$model2 = new ReserveDayList();
$model2->day = date('Y-m-d', strtotime($model->start_day.'+'.$i.' day'));
$model2->save();
$model->reserveDayLists()->attach($model2);
}
}
ちょっと変数名がよろしくありませんが、attach関数でLaravelは自身で中間テーブルを認識し、レコードの紐付けを行います。
逆に削除する場合は、
public function deleteById($id)
{
$model = $this->getItemById($id);
$model2s = $model->reserveDayLists()->get();
$model->reserveDayLists()->detach();
foreach($model2s as $model2)
{
$model2->delete();
}
$model->delete();
}
今度は逆にdetach関数で紐付けを解除します。
少し修正が発生しましたが、これで少ないコードでデータベースを簡単に扱うことができます。
↑よかったらクリックお願いします。