2018/10/12
CRUDの機能を実装したところで、次に必要になるのが検索機能ですよね。
今回は検索機能を実装してみます。
やりたいこと
名前もしくはメールアドレスで検索できるようにする
方針
Laravel5.xから標準ロードされなくなったHTML Helperは使わないことにしました。
あまり意味を感じないし、最近の動向では各種JSやCSSフレームワークとの連動が必要なのでむしろ邪魔だらからです。
予備知識
検索フォームで入力したデータを受け取る処理の知識が必要です。
検索の処理はEloquentのWhere節を使います。
進め方
【1】フォームの作成
【2】コントローラの編集
【1】フォームの作成
index.blade に検索フォームを追加します。
グリッドシステムで検索フォームとページャーを並べてみました。
: (省略) <div class="container-fluid"> <div class="row"> <!--↓↓ 検索フォーム ↓↓--> <div class="col-sm-4" style="padding:20px 0; padding-left:0px;"> <form class="form-inline" action="{{url('/crud')}}"> <div class="form-group"> <input type="text" name="keyword" value="{{$keyword}}" class="form-control" placeholder="名前を入力してください"> </div> <input type="submit" value="検索" class="btn btn-info"> </form> </div> <!--↑↑ 検索フォーム ↑↑--> <div class="col-sm-8" style="text-align:right;"> <div class="paginate"> {{ $data->appends(Request::only('keyword'))->links() }} </div> </div> <!--/.row--></div> <!--/.container-fluid--></div> : (省略)
フォームのメソッドはgetを指定。
フォームアクションにはルーティングファイルの Route::resource で指定しているパスを指定します。
これでコントローラの indexメソッド が実行されます。
【2】 コントローラの編集
コントローラのindexメソッドに検索機能を追加します。
public function index(Request $request) { #キーワード受け取り $keyword = $request->input('keyword'); #クエリ生成 $query = User::query(); #もしキーワードがあったら if(!empty($keyword)) { $query->where('name','like','%'.$keyword.'%')->orWhere('mail','like','%'.$keyword.'%'); } #ページネーション $data = $query->orderBy('created_at','desc')->paginate(10); return view('crud.index')->with('data',$data) ->with('keyword',$keyword) ->with('message','ユーザーリスト'); }
keywordが送られてきているかどうかを判断し、送られていなければ、通常の処理(全検索)を行います。
keywordがあれば、where句を追加した検索を行っています。
また、keywordの持ち回りのため、送られてきたkeywordを->with('keyword',$keyword)でビューに戻しています。
動作確認
1. 検索フォームにキーワードを入れて検索
『島村』と入力してみました。
2. 検索結果
問題なく表示しています。
同様にメールアドレスでも検索できます。
以上です。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。