前回までの様子はこちら
最新ソースはこちら
https://github.com/takishita2nd/hotel-mng
前回は部屋を登録・編集・削除できるようにしましたので、これを予約管理と連携させます。
まずは一覧表示。
リポジトリのget処理を修正します。
/**
* 予約一覧を取得する
*
* @return ReserveManagement[]
*/
public function getList()
{
$select = ['reserve_managements.id as id', 'reserve_managements.name as name', 'address', 'phone', 'num', 'rooms.name as room', 'days', 'start_day'];
return ReserveManagement::select($select)
->where('lodging', false)
->orderBy('start_day')
->leftJoin('reserve_management_room', 'reserve_managements.id', '=', 'reserve_management_room.reserve_management_id')
->leftJoin('rooms', 'reserve_management_room.room_id', '=', 'rooms.id')
->get();
}
結合を使って一覧画面に部屋名も出力されます。
おそらくリレーションを使うよりはこちらのほうが早いような気がします。
次は予約登録処理。
登録画面には、部屋テーブルの中身をコンボボックスで選択できるようにします。
<tr>
<th>宿泊部屋</th>
<td>{!! Form::select('room', $rooms) !!}</td>
</tr>
/**
* 入力フォーム
*
* @return \Illuminate\Http\Response
*/
public function create()
{
return view('register.create',
['rooms' => $this->roomRepository->getRoomList()]);
}
/**
* IDと部屋名のリストを取得する
*/
public function getRoomList()
{
$rooms = Array();
foreach(Room::get() as $room)
{
$rooms[$room->id] = $room->name;
}
return $rooms;
}
実際に登録を行う際は、POSTリクエストの部屋IDを受け取ることになります。
予約レコードと部屋レコードを中間テーブルで連携させることで予約と部屋を紐づけします。
/**
* 登録処理
*/
public function store(ManagementRequest $request)
{
if($this->registerManagement->checkSchedule($request->start_day, $request->days) == false)
{
return redirect('management/create')
->with(['error' => 'スケジュールが重複します'])
->withInput();
}
$param = $this->registerManagement->getParam();
$this->registerManagement->add([
$param[0] => $request->name,
$param[1] => $request->address,
$param[2] => $request->phone,
$param[3] => $request->num,
$param[4] => $request->days,
$param[5] => $request->start_day,
$param[6] => false
], $request->room);
return redirect('management');
}
/**
* 予約を登録する
*
* @return void
*/
public function add($param, $room)
{
$model = new ReserveManagement;
foreach($this->paramNames as $name)
{
$model->$name = $param[$name];
}
$model->save();
$this->attachToRoom($model, $room);
$this->attachToSchedule($model);
}
public function attachToRoom($model, $room)
{
$model3 = Room::where('id', $room)->first();
$model->rooms()->attach($model3);
}
予約編集も同様。
<tr>
<th>宿泊部屋</th>
<td>{!! Form::select('room', $rooms, $item->room_num) !!}</td>
</tr>
/**
* 編集処理
*
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
return view('register.edit',
['item' => $this->registerManagement->getReserveById($id),
'rooms' => $this->roomRepository->getRoomList()]);
}
/**
* 予約を一件取得する
*/
public function getReserveById($id)
{
$model = $this->getItemById($id);
$model->room_num = $model->rooms()->first()->id;
$model->room_name = $model->rooms()->first()->name;
return $model;
}
一件のデータの場合はリレーションを使うのが簡単です。これができるLaravelはホント便利。
/**
* 更新処理
*/
public function update(ManagementRequest $request)
{
if($this->registerManagement->checkScheduleForUpdate($request->start_day, $request->days, $request->id) == false)
{
return redirect('management/create')
->with(['error' => 'スケジュールが重複します'])
->withInput();
}
$param = $this->registerManagement->getParam();
$this->registerManagement->updateById($request->id,
[
$param[0] => $request->name,
$param[1] => $request->address,
$param[2] => $request->phone,
$param[3] => $request->num,
$param[4] => $request->days,
$param[5] => $request->start_day,
$param[6] => false
], $request->room);
return redirect('management');
}
/**
* 予約を更新する
*
* @return void
*/
public function updateById($id, $param, $room)
{
$model = $this->getItemById($id);
foreach($this->paramNames as $name)
{
$model->$name = $param[$name];
}
$model->save();
$this->detachToRoom($model, $model->rooms()->first()->id);
$this->detachToSchedule($model);
$this->attachToRoom($model, $room);
$this->attachToSchedule($model);
}
public function detachToRoom($model, $room)
{
$model3 = Room::where('id', $room)->first();
$model->rooms()->detach($model3);
}
一旦古い情報でデタッチし、新しい情報でアタッチします。
削除も同じように、
<tr>
<th>宿泊部屋</th>
<td>{!! $item->room_name !!}</td>
</tr>
/**
* 削除確認
*
* @return \Illuminate\Http\Response
*/
public function conform($id)
{
return view('register.conform', ['item' => $this->registerManagement->getReserveById($id)]);
}
/**
* 予約を削除する
*
* @return void
*/
public function deleteById($id)
{
$model = $this->getItemById($id);
$this->detachToRoom($model, $model->rooms()->first()->id);
$this->detachToSchedule($model);
$model->delete();
}
そんなにソースコードは変更していないけど、一気に進みましたね。
次回はスケジュールを部屋ごとに表示するところをやっていきます。
バナークリックで応援よろしくお願いします。