前回までの状況はこちら。
最新ソースはこちら。(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が指定されない場合のデフォルト処理として使用します。
これで一通り必要な機能は実装できたはず。
最終確認して提出したいと思います。
バナークリックで応援よろしくお願いします。