本日から本気出す。
前回までの状況はこちら
最新ソースはこちら(gitHub)
https://github.com/takishita2nd/hotel-mng
実は、このリポジトリの処理には重大な問題があります。
public function getCheckoutList()
{
$ret = array();
$index = 0;
$checkout = ReserveManagement::select('rooms.name as roomname', 'checkout')
->leftJoin('reserve_management_room', 'reserve_managements.id', '=', 'reserve_management_room.reserve_management_id')
->leftJoin('rooms', 'reserve_management_room.room_id', '=', 'rooms.id')
->get();
date_default_timezone_set('Asia/Tokyo');
$today = date("Y-m-d");
foreach ($checkout as $value) {
$str = explode(" ", $value->checkout);
if($today == $str[0]) {
$value->checkout = $str[1];
$ret[$index] = $value;
$index++;
}
}
return $ret;
}
全レコードを取得したあと、日付チェックをおこない、必要なデータのみを取得する、というやり方ですが、このやり方では、大量のデータをデータベースから取得し、PHPで処理する、というやり方なので、サーバに大きな負荷がかかります。
これを解消するには、データベースから取得するデータの量を度絞らなければなりません。
なので、以下のように修正します。
public function getCheckoutList()
{
date_default_timezone_set('Asia/Tokyo');
$today = date("Y-m-d 00:00:00");
$tomorrow = date("Y-m-d 00:00:00", strtotime("tomorrow"));
return ReserveManagement::select('rooms.name as roomname', 'checkout')
->leftJoin('reserve_management_room', 'reserve_managements.id', '=', 'reserve_management_room.reserve_management_id')
->leftJoin('rooms', 'reserve_management_room.room_id', '=', 'rooms.id')
->whereBetween('checkout', [$today, $tomorrow])
->get();
}
クエリビルダにwhereBetween()を追加し、BETWEEN節を追加しました。範囲は、アクセス当日の0時から次の日の0時です。
これだけで必要なデータは全て取れましたので、それをそのまま返します。
動作結果は前回と同じになります。
うん、こっちのほうがコードもスッキリしていいですね。