【laravel】【ホテル予約管理】チェックアウト時刻一覧の問題を解決する

本日から本気出す。

前回までの状況はこちら

最新ソースはこちら(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時です。

これだけで必要なデータは全て取れましたので、それをそのまま返します。

動作結果は前回と同じになります。

うん、こっちのほうがコードもスッキリしていいですね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください