もう少しで完成だから、もうちょっとやって終わろうと思ったら、ガッツリ書き換えることになるというプログラマーあるある。
やっぱり、チェックしたかどうかも管理するべきだろう(もはや仕様変更レベル)と思いました。
データベースに、「チェックしたかどうか」を格納するカラムを追加します。
マイグレーションファイルを作成し、マイグレートします。
class AddSubmit extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('reserve_managements', function (Blueprint $table) { $table->boolean('lodging'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('reserve_managements', function (Blueprint $table) { $table->dropColumn('lodging'); }); } }
ちょっと名前がいろいろとアレだけど、あとから直すの面倒くさいので、そのまま使用する。(ちゃんと前もって設計しなさい、という話。)
予約一覧にチェックしたらポチるボタンを設置。
<table class="management"> <tr> <th class="name">名前</th> <th class="address">住所</th> <th class="phone">電話番号</th> <th class="num">人数</th> <th class="date">宿泊日</th> <th class="num">宿泊日数</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="date">{{ $list->start_day }}</td> <td class="num">{{ $list->days }}</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>
ポチったらPOSTでid番号を受け取り、追加したカラムをtrueに変更して予約一覧へリダイレクト。
/** * 宿泊処理確認 * * @return \Illuminate\Http\Response */ public function lodging(Request $request) { $this->registerManagement->lodging($request->id); return redirect('management'); }
/** * 宿泊処理を行う */ public function lodging($id) { $model = $this->getItemById($id); $model->lodging = true; $model->save(); }
スケジュール一覧にもチェックしたかどうかを表示します。
<table class="schedule"> <tr> <th class="date">日時</th> <th class="name">名前</th> <th class="lodging">宿泊状況</th> </tr> @foreach ($Lists as $list) <tr> <td class="date">{{ $list['day'] }}</td> <td class="name">{{ $list['name'] }}</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, '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, 'lodging' => $model->reserveManagements()->first()->lodging ); $index++; } return $lists; }
集計も、チェック済みのものだけ集計対象にします。
テーブルを結合して、チェック済みの日数を数えます。
/** * 月毎に集計する */ public function countByMonthly() { return ReserveDayList::select(DB::raw('DATE_FORMAT(day, "%Y-%m") as yearmonth'), DB::raw('count(*) as count'), DB::raw('count(*) * 2000 as total')) ->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') ->where('reserve_managements.lodging', true) ->groupby('yearmonth') ->get(); }
leftJoinが記載が汚いかもしれないけど、これはLaravelであるがゆえの運命。仕方がない。
これで本当に完成。提出してきます。
最終ソースはこちら
https://github.com/takishita2nd/hotel-mng
バナークリックで応援よろしくおねがいします。