【Laravel】月ごとにデータをフィルタさせる

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

最新ソースはこちら。

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

一通りデータの登録はできましたが、このままデータが増えると1画面に大量のデータが表示されることになります。

なので、一覧のデータを月毎にフィルタ表示させたいと思います。

まず、Viewを修正。

年月を指定できるようにします。

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

本来は、Vue.jsなどを使ってフロントエンド側でうまくできるのが理想なのですが、今からVueの実装を行うのは面倒くさいので、フィルタ情報を一旦POSTで受け取り、GET+クエリパラメータの形にして、リダイレクトさせるという方法をとります。

ルートの設定。

Route::post('/management/indexToMonthly', 'RegisterManagementController@indexToMonthly');

コントローラ。まずはGETの方。

    /**
     * Show the Register.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        if(is_null($request->input('year')) || is_null($request->input('month')))
        {
            return view('register.index', ['registerLists' => $this->registerManagement->getList()]);
        }
        else
        {
            return view('register.index', ['registerLists' => $this->registerManagement->getListByMonth($request->input('year'), $request->input('month'))]);
        }
    }

GETリクエストでも引数にRequest $requestを書き足せば、クエリパラメータを取得できます。

忘れてはいけないのは、クエリパラメータがNULLだった場合。

is_null()でNULLチェックを行い、デフォルト(パラメータがない場合)の画面表示をさせるようにしましょう。

次は、POST側の処理。

    /**
     * indexの月別表示
     *
     * @return \Illuminate\Http\Response
     */
    public function indexToMonthly(Request $request)
    {
        return redirect('management?year='.$request->year.'&month='.$request->month);
    }

クエリパラメータ付きURLを作成し、リダイレクトを行っています。

これしか方法が思い浮かばなかった。

次はリポジトリ。

    /**
     * 月別予約一覧を取得する
     * 
     * @return ReserveManagement[]
     */
    public function getListByMonth($year, $month)
    {
        return ReserveManagement::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)))
                                ->get();
    }

whereを2つ付けることでAND条件になります。

クエリビルダー便利。

同じやり方をスケジュール一覧にも行います。

十分とは言えませんが、やりたいことはできました。

たぶん次でラスト。

月毎に売上を集計して表示させます。

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

「【Laravel】月ごとにデータをフィルタさせる」への1件のフィードバック

コメントを残す

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

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