練習でLaravelを使い掲示板サイトを作成しており、検索フォームを以下の仕様で作りたいと考え、更に下記のコードにて実装しました。
- 1つの検索欄でAND検索、NOT検索の実装(要はGoogleのような検索機能の実装)
- 空白を認識し語句を分割する
- 2つ以上の語句があればAND検索
- -(半角ハイフン)を含む語句があればその語句をNOT検索
PHP
1//掲載にあたり一部 実際のコードとの差異あり 2 3public function search(Request $request) 4 { 5 // フォーム入力値の空白を認識し分割 6 $words = preg_split('/[\p{Z}\p{Cc}]++/u', $request->search, 2, PREG_SPLIT_NO_EMPTY); 7 8 // -の付く語句を検索 9 $index = preg_grep('/-/', $words); 10 11 if (empty($index)) { // -語句無ければ通常の、またはAND検索 12 if (count($words) == 2) { // 語句が2つあればAND検索 13 $query = Article::where('title', 'like', "%$words[0]%")->where('title', 'like', "%$words[1]%"); 14 } else if (count($words) == 1) { 15 $query = Article::where('title', 'like', "%$words[0]%"); 16 } else { 17 return back(); 18 } 19 } else { 20 $exclude = implode(preg_replace('/-/', '', $index)); // 除外語句の整形、格納 21 $word = implode(preg_grep('/-/', $words, PREG_GREP_INVERT)); // 通常語句の格納 22 23 $query = Article::where('title', 'like', "%$word%")->where('title', 'not like', "%$exclude%"); 24 } 25 26 $article = $query->paginate(7); 27 return view('layouts.result', ['article' => $article]); 28 }
参考記事
認識している問題点
- 語句が増える度where句をつなげる必要がある。
- 現在分割を2語句までとしているが、今後増やす場合いちいち条件分岐つくらなければならない、よってコードが長ったらしくなる。
- 仮にOR検索を含める場合、更に複雑化する。
手探りの為、メソッドの継ぎ接ぎにより検索を実現させている状態です。至らぬ点あればご指摘お願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/21 07:16