「技術」カテゴリーアーカイブ

【laravel】【ホテル予約管理】チェックアウト時間を追加する

最新ソースはこちら

https://github.com/takishita2nd/hotel-mng

さて、次の課題は、予約登録時にチェックアウト時間を登録し、日毎のチェックアウト時間と部屋を一覧に表示することです。

まずは、チェックアウト時間を登録する処理から作っていきます。

マイグレーションファイルを作成し、予約管理テーブルにチェックアウト時間を登録できるようにします。

class AddCheckout extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('reserve_managements', function (Blueprint $table) {
            $table->datetime('checkout')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('reserve_managements', function (Blueprint $table) {
            $table->dropColumn('checkout');
        });
    }
}

次は、予約追加画面にチェックアウト時間を登録できるようにするのですが、30分おきにリストから選択する、という形式にしましょうか。

    /**
     * 時間一覧を30分おきにして返す
     */
    public function getTimeList()
    {
        $time = 0;
        $ret = array();
        for($i = 0; $i < 48; $i++)
        {
            $time = strtotime('00:00 + '.($i * 30).' minute') - strtotime('00:00');
            $ret[$time] = date('H:i', $time);
        }
        return $ret;
    }

これでarray[‘チックタイム’] = ’時間:分’というような形でリストを作成します。

これを表示します。

    public function create()
    {
        return view('register.create',
                    [
                        'rooms' => $this->roomRepository->getRoomList(),
                        'timelist' => $this->registerManagement->getTimeList()
                    ]
                );
    }
                    <tr>
                        <th>チェックアウト</th>
                        <td>{!! Form::select('checkout', $timelist) !!}</td>
                    </tr>
    public function store(ManagementRequest $request)
    {
        if($this->registerManagement->checkSchedule($request->start_day, 
                                                    $request->days, 
                                                    $request->room) == 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,
            $param[7] => date('Y-m-d H:i', strtotime($request->start_day.'+'.$request->days.' day') + $request->checkout)
        ], $request->room);
        return redirect('management');
    }

チェックアウト時間は、宿泊日+宿泊日数+チェックアウト時間で計算します。

で、これを一覧表示。

    public function getList()
    {
        $select = ['reserve_managements.id as id', 'reserve_managements.name as name', 'address', 'phone', 'num', 'rooms.name as room', 'checkout', '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();
    }
    public function getListByMonth($year, $month, $room)
    {
        $select = ['reserve_managements.id as id', 'reserve_managements.name as name', 'address', 'phone', 'num', 'rooms.name as room', 'checkout', 'start_day'];
        return ReserveManagement::select($select)
                                ->leftJoin('reserve_management_room', 'reserve_managements.id', '=', 'reserve_management_room.reserve_management_id')
                                ->leftJoin('rooms', 'reserve_management_room.room_id', '=', 'rooms.id')
                                ->where('start_day', '>=', date('Y-m-d', strtotime('first day of '.$year.'-'.$month)))
                                ->where('start_day', '<=', date('Y-m-d', strtotime('last day of '.$year.'-'.$month)))
                                ->where('reserve_management_room.room_id', $room)
                                ->where('lodging', false)
                                ->orderBy('start_day')
                                ->get();
    }

まぁ、やってることは、select句の中にcheckoutを追加しただけですが。

                    <table class="management">
                        <tr>
                            <th class="name">名前</th>
                            <th class="address">住所</th>
                            <th class="phone">電話番号</th>
                            <th class="num">人数</th>
                            <th class="room">部屋</th>
                            <th class="date">宿泊日</th>
                            <th class="checkout">チェックアウト</th>
                            <th class="command">編集</th>
                            <th class="command">削除</th>
                            <th class="command">宿泊</th>
                        </tr>
                    @foreach ($registerLists as $list)
                        <tr>
                            <td class="name">{{ $list->name }}</td>
                            <td class="address">{{ $list->address }}</td>
                            <td class="phone">{{ $list->phone }}</td>
                            <td class="num">{{ $list->num }}</td>
                            <td class="room">{{ $list->room }}</td>
                            <td class="date">{{ $list->start_day }}</td>
                            <td class="checkout">{{ $list->checkout }}</td>
                            <td class="command">{{ Html::link('/management/'.$list->id.'/edit', '編集') }}</td>
                            <td class="command">{{ Html::link('/management/'.$list->id.'/conform', '削除') }}</td>
                            <td class="command">
                            {!! Form::open(['url' => action('RegisterManagementController@lodging')]) !!}
                            {!! Form::hidden('id', $list->id) !!}
                            {!! Form::submit('宿泊') !!}
                            {!! Form::close() !!}
                            </td>
                        </tr>
                    @endforeach
                    </table>

宿泊日数のところをチェックアウト時間に置き換えました。

編集処理も同じように修正しています。

とりあえず、ここまで。

【Laravel】【ホテル予約管理】部屋ごとに集計する

前回までの状況はこちら。

最新ソースはこちら。(github)

https://github.com/takishita2nd/hotel-mng

最後は集計処理です。

今までは年月ごとに集計していましたが、今回はさらに部屋ごとに集計します。

さらに、部屋ごとに値段を自由に設定できるようにしたので、合計金額の算出処理も変更になります。

では、Viewに、部屋ごとにフィルタするコントロールを追加します。

                    {!! Form::open(['url' => action('RegisterManagementController@totalToMonthly')]) !!}
                    <table>
                        <tr>
                            <td>{!! Form::select('room', $rooms) !!}</td>
                            <td>{!! Form::submit('表示') !!}</td>
                        </tr>
                    </table>
                    {!! Form::close() !!}
                    <table class="total">
                        <tr>
                            <th class="yearmonth">年月</th>
                            <th class="name">部屋</th>
                            <th class="couont">件数</th>
                            <th class="total">売上</th>
                        </tr>
                    @foreach ($Lists as $list)
                        <tr>
                            <td class="yearmonth">{{ $list->yearmonth }}</td>
                            <td class="name">{{ $list->roomname }}</td>
                            <td class="couont">{{ $list->count }}</td>
                            <td class="total">{{ $list->total }}</td>

                        </tr>
                    @endforeach
                    </table>

フィルタ処理は、他のフィルタ処理と同様に、POSTリクエストすると、クエリパラメータ付きのURLに変換して、GETリクエストにリダイレクトします。

    /**
     * 月毎の集計を表示
     */
    public function total(Request $request)
    {
        if(is_null($request->input('room')))
        {
            return view('register.total', 
                            [
                                'Lists' => $this->registerManagement->countByMonthly(),
                                'rooms' => $this->roomRepository->getRoomList()
                            ]);
        }
        else
        {
            return view('register.total', 
                            [
                                'Lists' => $this->registerManagement->countByMonthly($request->input('room')),
                                'rooms' => $this->roomRepository->getRoomList()
                            ]);
        }
    }

    /**
     * 月毎の集計を表示
     */
    public function totalToMonthly(Request $request)
    {
        return redirect('management/total?room='.$request->room);
    }

次にリポジトリの処理。

今回は集計処理を行うDBアクセスと、部屋の値段を取得するDBアクセスを行い、PHP側で金額を算出させます。

    /**
     * 月毎に集計する
     */
    public function countByMonthly($room = 1)
    {
        $lists = ReserveDayList::select(DB::raw('DATE_FORMAT(day, "%Y-%m") as yearmonth'), DB::raw('count(*) as count'), 'rooms.name as roomname')
                                ->leftJoin('reserve_day_list_reserve_management', 'reserve_day_lists.id', '=', 'reserve_day_list_reserve_management.reserve_day_list_id')
                                ->leftJoin('reserve_managements', 'reserve_day_list_reserve_management.reserve_management_id', '=', 'reserve_managements.id')
                                ->leftJoin('reserve_management_room', 'reserve_managements.id', '=', 'reserve_management_room.reserve_management_id')
                                ->leftJoin('rooms', 'reserve_management_room.room_id', '=', 'rooms.id')
                                ->where('reserve_managements.lodging', true)
                                ->where('rooms.id', $room)
                                ->groupby('yearmonth')
                                ->groupby('roomname')
                                ->get();

        $model3 = Room::where('id', $room)->first();

        $ret = array();
        $index = 0;
        foreach($lists as $list)
        {
            $list->total = $list->count * $model3->price;
            $ret[$index] = $list;
            $index++;
        }

        return $ret;
    }

テーブルはすべて結合。

年月と部屋名でグループ分けすることで、それごとのレコード数を取得することができます。

さらに、WHERE句で部屋IDを指定することによって、必要な部屋の情報だけを取得することができます。

この関数の引数は部屋ID=1で初期化してあります。

この関数を使用するときに、引数を入れなければ、値1として処理実行されます。

これは部屋IDが指定されない場合のデフォルト処理として使用します。

これで一通り必要な機能は実装できたはず。

最終確認して提出したいと思います。

バナークリックで応援よろしくお願いします。

【Laravel】【ホテル予約管理】部屋でフィルタをかける

前回までの状況はこちら

最新ソースはこちら

https://github.com/takishita2nd/hotel-mng

今回は予約一覧とスケジュール一覧を部屋でフィルタをかける修正を行います。

フィルタに部屋を追加します。

                    {!! Form::open(['url' => action('RegisterManagementController@indexToMonthly')]) !!}
                    <table>
                        <tr>
                            <td>{!! Form::selectYear('year', 2019, 2020) !!}年</td>
                            <td>{!! Form::selectMonth('month') !!}</td>
                            <td>{!! Form::select('room', $rooms) !!}</td>
                            <td>{!! Form::submit('表示') !!}</td>
                        </tr>
                    </table>
                    {!! Form::close() !!}

部屋情報をViewに渡し、選択した部屋IDを受け取るようにコントローラーを修正します。

    public function index(Request $request)
    {
        if(is_null($request->input('year')) || is_null($request->input('month')) || is_null($request->input('room')))
        {
            return view('register.index', 
                [
                    'registerLists' => $this->registerManagement->getList(),
                    'rooms' => $this->roomRepository->getRoomList()
                ]
            );
        }
        else
        {
            return view('register.index', 
                [
                    'registerLists' => $this->registerManagement->getListByMonth($request->input('year'), 
                                                                                $request->input('month'), 
                                                                                $request->input('room')),
                    'rooms' => $this->roomRepository->getRoomList()
                ]
            );
        }
    }
    public function indexToMonthly(Request $request)
    {
        return redirect('management?year='.$request->year.'&month='.$request->month.'&room='.$request->room);
    }

関数名おかしいけど気にするな。

    public function getListByMonth($year, $month, $room)
    {
        return ReserveManagement::leftJoin('reserve_management_room', 'reserve_managements.id', '=', 'reserve_management_room.reserve_management_id')
                                ->where('start_day', '>=', date('Y-m-d', strtotime('first day of '.$year.'-'.$month)))
                                ->where('start_day', '<=', date('Y-m-d', strtotime('last day of '.$year.'-'.$month)))
                                ->where('reserve_management_room.room_id', $room)
                                ->where('lodging', false)
                                ->orderBy('start_day')
                                ->get();
    }

予約管理テーブルと部屋(正確には中間テーブル)を結合して、指定された部屋番号でwhere句を追加します。

これで得られたリストが年月と部屋でフィルタされたものになります。

同じようにスケジュール一覧も修正します。

    public function schedule(Request $request)
    {
        if(is_null($request->input('year')) || is_null($request->input('month')) || is_null($request->input('room')))
        {
            return view('register.schedule', 
                        [
                            'Lists' => $this->registerManagement->getSchedule(),
                            'rooms' => $this->roomRepository->getRoomList()
                        ]
                    );
        }
        else
        {
            return view('register.schedule', 
                [
                    'Lists' => $this->registerManagement->getScheduleByMonth($request->input('year'), 
                                                                            $request->input('month'),
                                                                            $request->input('room')),
                    'rooms' => $this->roomRepository->getRoomList()
                ]
            );
        }
    }
    public function scheduleToMonthly(Request $request)
    {
        return redirect('management/schedule?year='.$request->year.'&month='.$request->month.'&room='.$request->room);
    }
    public function getScheduleByMonth($year, $month, $room)
    {
        return ReserveDayList::select('day', 'reserve_managements.name as name', 'rooms.name as room', 'lodging')
                                ->leftJoin('reserve_day_list_reserve_management', 'reserve_day_lists.id', '=', 'reserve_day_list_reserve_management.reserve_day_list_id')
                                ->leftJoin('reserve_managements', 'reserve_day_list_reserve_management.reserve_management_id', '=', 'reserve_managements.id')
                                ->leftJoin('reserve_management_room', 'reserve_managements.id', '=', 'reserve_management_room.reserve_management_id')
                                ->leftJoin('rooms', 'reserve_management_room.room_id', '=', 'rooms.id')
                                ->where('day', '>=', date('Y-m-d', strtotime('first day of '.$year.'-'.$month)))
                                ->where('day', '<=', date('Y-m-d', strtotime('last day of '.$year.'-'.$month)))
                                ->where('rooms.id', $room)
                                ->orderBy('day')
                                ->get();
    }

リポジトリはガッツリ書き換えました。

全部テーブルを結合して、where句でフィルタして、必要な情報をselectして・・・とやって、全部データベース一発で出力できるようにしました。

あとは集計処理ですな。

バナークリックで応援よろしくお願いします。

【Laravel】スケジュールの重複をチェックする

前回までの状況はこちら。

最新ソースはこちら。

https://github.com/takishita2nd/hotel-mng

今回も内容薄いかもしれん。

今までは予約登録時、日にちが重複していればエラーを表示させていました。

これが通用するのは部屋が一つしか無い場合のみでして、

今回は部屋が複数あるので、日にちだけのチェックだけではなくて、部屋もチェックに含めなければいけません。

というわけで、引数に部屋IDを追加。

    /**
     * 登録処理
     */
    public function store(ManagementRequest $request)
    {
        if($this->registerManagement->checkSchedule($request->start_day, 
                                                    $request->days, 
                                                    $request->room) == false)
        {
            return redirect('management/create')
                        ->with(['error' => 'スケジュールが重複します'])
                        ->withInput();
        }
    /**
     * 更新処理
     */
    public function update(ManagementRequest $request)
    {
        if($this->registerManagement->checkScheduleForUpdate($request->start_day, 
                                                            $request->days, 
                                                            $request->id, 
                                                            $request->room) == false)
        {
            return redirect('management/create')
                        ->with(['error' => 'スケジュールが重複します'])
                        ->withInput();
        }

そしてチェック処理本体。

    /**
     * スケジュールの重複を確認する
     * 
     * @return boolean
     */
    public function checkSchedule($date, $num, $room)
    {
        for($i = 0; $i < $num; $i++)
        {
            $record = ReserveDayList::where(['day' => date('Y-m-d', strtotime($date.'+'.$i.' day'))])->first();
            if(is_null($record) == false)
            {
                if($record->reserveManagements()->first()->rooms()->first()->id == $room)
                {
                    return false;
                }
            }
        }

        return true;
    }
    /**
     * 更新時のスケジュールの重複を確認する
     * 
     * @return boolean
     */
    public function checkScheduleForUpdate($date, $num, $userId, $room)
    {
        for($i = 0; $i < $num; $i++)
        {
            $model2 = ReserveDayList::where(['day' => date('Y-m-d', strtotime($date.'+'.$i.' day'))])->first();
            if(is_null($model2) == false)
            {
                if($model2->reserveManagements()->first()->rooms()->first()->id == $room)
                {
                    if($model2->reserveManagements()->first()->id != $userId)
                    {
                        return false;
                    }
                }
            }
        }

        return true;
    }

strtotime($date.’+0 day’)ってできたんだ。

やってることは部屋チェックを追加しただけです。

簡単ですね。

これで、日付は同じだけど部屋が違う場合は予約可、日付と部屋が同じ場合は予約不可、というロジックが完成しました。

バナークリックで応援よろしくおねがいします。

【自作PC】【男のロマン】フルスペックのMac Proに対抗できる自作PCを考えてみる

実際に組むわけではないけど、もしMac Proに対抗できる自作PCを作ったら、という前提で検討してみた。

もはやこれは男のロマンの話です。

オイラが机上で考えた構成なので、動作確認はできません。

自己責任でお願いします。

買えるとは思えませんが。

CPU

Xeon W-3275M

https://kakaku.com/item/K0001211650/

型番の後ろにMが付いているのと付いていないのがありますが、Mが無いと、メモリ1TBまでしか認識しないそうです。

つまり、Mac Proのフルスペックが1.5TBなので、必然的にMが付いたモデルになります。

97万円。

マザーボード

Z11PA-U12

https://kakaku.com/item/K0001043740/

Mac Proのフルスペックである1.5TBのメモリを搭載するにはメモリスロット12個のマザーボードに128GBのメモリを搭載しなければいけません。

その上で、CPUに対応するソケットはLGA3647なので、それに対応するマザーボードを選択しました。

6万円。

でもさらに上を行くこともできます。

CPU2個搭載するモデルですが、メモリスロット16個のヤツを買えばメモリ2TBが可能です。

メモリ

クルーシャル 128GB DDR4 2666 MT/s (PC4-21300) CL19 Octal-Rank x4 CT128G4ZFJ426S

https://www.askul.co.jp/p/E693297/?int_id=recom_DtVar

上にも書いたとおり、1.5TBのメモリを実現するには、128GBのメモリが12枚必要です。

22万円×12枚=264万円。

グラフィックボード

HP Q1K37A AMD Radeon Pro WX7100 GPU モジュール

https://product.rakuten.co.jp/product/-/cea5a95901c6a369598272b7921f253a/?scid=we_twt_upc249

最近出たばかりのグラボですが、これがMac Proと同じモデルのはずです。

16万円。

ストレージ

7.68TB 5210 ION SSD SATA 2.5インチ エンタープライズ

この当たりだったら購入しても現実的に使えそう。

8TBのSSDです。

13万円。

あとは、電源ユニット、PCケース、CPUクーラーなどがありますが、価格.comでも多くの種類がヒットしますし、そんなに値段もしないでしょう。

とりあえず、一番お金がかかりそうなところをピックアップしてみました。

総額。

およそ400万円。(+電源とかいろいろ)

すごいぞ、自作PcならMac Proに匹敵するPCを400万で作れる!(机の上の計算では)

バナークリックで応援よろしくおねがいします。

【Laravel】【ホテル予約管理】スケジュールと部屋の連携

前回までの状況はこちら

最新ソースはこちら

https://github.com/takishita2nd/hotel-mng

今回は中身薄いかも。

スケジュール画面に部屋名を表示させます。

難しいことはなく、画面に部屋名の表示を付け足すだけです。

                    <table class="schedule">
                        <tr>
                            <th class="date">日時</th>
                            <th class="name">名前</th>
                            <th class="room">部屋</th>
                            <th class="lodging">宿泊状況</th>
                        </tr>
                    @foreach ($Lists as $list)
                        <tr>
                            <td class="date">{{ $list['day'] }}</td>
                            <td class="name">{{ $list['name'] }}</td>
                            <td class="room">{{ $list['room'] }}</td>
                            @if ($list['lodging'])
                                <td class="lodging">チェック</td>
                            @else
                                <td class="lodging">未チェック</td>
                            @endif
                        </tr>
                    @endforeach
                    </table>
    /**
     * スケジュール一覧を取得する
     */
    public function getSchedule()
    {
        $lists = array();
        $index = 0;
        $models = ReserveDayList::orderBy('day')
                                    ->get();
        foreach($models as $model)
        {
            $lists[$index] = array(
                                'day' => $model->day,
                                'name' => $model->reserveManagements()->first()->name,
                                'room' => $model->reserveManagements()->first()->rooms()->first()->name,
                                'lodging' => $model->reserveManagements()->first()->lodging
                            );
            $index++;
        }
        return $lists;
    }

    /**
     * 月別スケジュール一覧を取得する
     */
    public function getScheduleByMonth($year, $month)
    {
        $lists = array();
        $index = 0;
        $models = ReserveDayList::where('day', '>=', date('Y-m-d', strtotime('first day of '.$year.'-'.$month)))
                                ->where('day', '<=', date('Y-m-d', strtotime('last day of '.$year.'-'.$month)))
                                ->orderBy('day')
                                ->get();
        foreach($models as $model)
        {
            $lists[$index] = array(
                                'day' => $model->day,
                                'name' => $model->reserveManagements()->first()->name,
                                'room' => $model->reserveManagements()->rooms()->first()->name,
                                'lodging' => $model->reserveManagements()->first()->lodging
                                );
            $index++;
        }
        return $lists;
    }

レコード一件ずつ参照してデータを取り出しているので、同じようにリレーションを使って部屋テーブルの部屋名を取り出している、という感じですね。

今回は難しくなかった。

残るは、部屋の競合チェック処理を変えなくちゃいけないのと、部屋でフィルタ表示させたい。

あとは部屋ごとの集計かな。

バナークリックで応援よろしくお願いします。

【Laravel】【ホテル予約管理】予約一覧に部屋を連携させる

前回までの様子はこちら

最新ソースはこちら

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();
    }

そんなにソースコードは変更していないけど、一気に進みましたね。

次回はスケジュールを部屋ごとに表示するところをやっていきます。

バナークリックで応援よろしくお願いします。