はじめに
Laravelではクエリビルダという機能があり、DBからレコードなどを取得する際にSQLに問い合わせると思うが、それを簡単にすることができる。
where句
だったりselect句
などSQLでよく見るものもたくさんあり、Laravelでは非常によく使われる。
そんな中あいまい検索というwhere句を使った部分検索できる機能があり、
そこで少し手間取ってしまったのでまとめてみる。
あいまい検索とは
基本的な使い方としては、ビュー画面などでキーワードを検索したときにコントローラでパラメータとして受け取り、対応するレコードを抽出してビューに返す。といった感じで使う。
あいまい検索なので、完全一致だけでなく、条件に応じて前後の文字が一致した場合などに対応させることができる。
あいまい検索の種類
先程条件に応じてと記載したが、あいまい検索にはいくつかの種類がある。
前方一致
、後方一致
、部分一致
がある。
$users = クラス::where("該当するカラム名", "LIKE", "条件");
- クラスを指定したのちwhere句の記載をする
- 第一引数に該当するカラム名、第二引数には今回あいまい検索なのでLIKEと記載する。第三引数にはどの一致なのかを記載してあげる。
それぞれクエリビルダでの書き方は以下のような感じ。
前方一致
$users = User::where("name", "LIKE", "%Bob")->get();
- 前方一致の場合は一番前に
%
を書いてあげる。こうすることで前方一致判定とすることができる。
後方一致
$users = User::where("name", "LIKE", "Bob%")->get();
- 後方一致の場合は一番最後に
%
を書いてあげる。こうすることで後方一致判定とすることができる。
部分一致
$users = User::where("name", "LIKE", "%Bob%")->get();
- 部分一致の場合は一番前と最後に
%
を書いてあげる。こうすることで部分一致判定とすることができる。
送られてきたパラメータを判定したい場合
上記のようにBob決め打ちではなく、検索などパラメータとして渡ってきたものを判定したい場合は以下のような感じで書いてあげる。
例えば、search=Bob
というような感じでパラメータが渡ってきたとする。
$hoge = $request->input('search');
$users = User::where("name", "LIKE", "%${search}%")->get();
のような感じで書いてあげる。
この際メソッドの引数には($request Request)
と書いてあげるのも忘れずに。
完全一致の場合はどう書くか?
自分が詰まってしまったのはこの部分。完全一致の場合どのように書けばよいか。
最初いろいろ調べたところ下記のような感じでかけそうだったので書いてみた。
$users = User::where("name", "LIKE", "Bob")->get();
うまくいかない。
どうするか。
よくよく考えてみたらあいまい検索言うくらいだから、完全一致はそもそもあいまいじゃなくない??という結論に至った。
だったら下記のような感じで書けば良さそう。
$users = User::where("name", "=", "Bob")->get();
うまくいった。普通にこれで良かった。
真ん中の第二引数はなくても大丈夫。
ちなみに先程もあった受け取ったパラメータを使って書く場合はこんな感じ。
$hoge = $request->input('search');
$users = User::where("name", "=", $search)->get();
多分この考えでいいのではないでしょうか。
間違った考えだったり、指摘あればよろしくおねがいしますmm