質問編集履歴
1
リストの表示変更、コード部分を色付きへ見やすく変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,91 +1,46 @@
|
|
1
1
|
練習でLaravelを使い掲示板サイトを作成しており、検索フォームを以下の仕様で作りたいと考え、更に下記のコードにて実装しました。
|
2
|
+
- 1つの検索欄でAND検索、NOT検索の実装(要はGoogleのような検索機能の実装)
|
3
|
+
- 空白を認識し語句を分割する
|
4
|
+
- 2つ以上の語句があればAND検索
|
5
|
+
- -(半角ハイフン)を含む語句があればその語句をNOT検索
|
2
6
|
|
3
|
-
0. 1つの検索欄でAND検索、NOT検索の実装(要はGoogleのような検索機能の実装)
|
4
|
-
|
5
|
-
0. 空白を認識し語句を分割する
|
6
|
-
|
7
|
-
0. 2つ以上の語句があればAND検索
|
8
|
-
|
9
|
-
0. -(半角ハイフン)を含む語句があればその語句をNOT検索
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
```
|
7
|
+
```PHP
|
14
|
-
|
15
8
|
//掲載にあたり一部 実際のコードとの差異あり
|
16
9
|
|
17
|
-
|
18
|
-
|
19
10
|
public function search(Request $request)
|
20
|
-
|
21
11
|
{
|
22
|
-
|
23
12
|
// フォーム入力値の空白を認識し分割
|
24
|
-
|
25
13
|
$words = preg_split('/[\p{Z}\p{Cc}]++/u', $request->search, 2, PREG_SPLIT_NO_EMPTY);
|
26
14
|
|
27
|
-
|
28
|
-
|
29
15
|
// -の付く語句を検索
|
30
|
-
|
31
16
|
$index = preg_grep('/-/', $words);
|
32
17
|
|
33
|
-
|
34
|
-
|
35
18
|
if (empty($index)) { // -語句無ければ通常の、またはAND検索
|
36
|
-
|
37
19
|
if (count($words) == 2) { // 語句が2つあればAND検索
|
38
|
-
|
39
20
|
$query = Article::where('title', 'like', "%$words[0]%")->where('title', 'like', "%$words[1]%");
|
40
|
-
|
41
21
|
} else if (count($words) == 1) {
|
42
|
-
|
43
22
|
$query = Article::where('title', 'like', "%$words[0]%");
|
44
|
-
|
45
23
|
} else {
|
46
|
-
|
47
24
|
return back();
|
48
|
-
|
49
25
|
}
|
50
|
-
|
51
26
|
} else {
|
52
|
-
|
53
27
|
$exclude = implode(preg_replace('/-/', '', $index)); // 除外語句の整形、格納
|
54
|
-
|
55
28
|
$word = implode(preg_grep('/-/', $words, PREG_GREP_INVERT)); // 通常語句の格納
|
56
29
|
|
57
|
-
|
58
|
-
|
59
30
|
$query = Article::where('title', 'like', "%$word%")->where('title', 'not like', "%$exclude%");
|
60
|
-
|
61
31
|
}
|
62
32
|
|
63
|
-
|
64
|
-
|
65
33
|
$article = $query->paginate(7);
|
66
|
-
|
67
34
|
return view('layouts.result', ['article' => $article]);
|
68
|
-
|
69
35
|
}
|
70
|
-
|
71
36
|
```
|
72
|
-
|
73
37
|
参考記事
|
74
|
-
|
75
38
|
- [【PHP】 空白文字で文字列を分割して検索用キーワードの配列を作る](https://qiita.com/mpyw/items/a704cb900dfda0fc0331)
|
76
|
-
|
77
39
|
- [Laravel8で除外キーワードで検索する方法について](https://teratail.com/questions/329171)
|
78
40
|
|
79
|
-
|
80
|
-
|
81
41
|
認識している問題点
|
82
|
-
|
83
42
|
- 語句が増える度where句をつなげる必要がある。
|
84
|
-
|
85
43
|
- 現在分割を2語句までとしているが、今後増やす場合いちいち条件分岐つくらなければならない、よってコードが長ったらしくなる。
|
86
|
-
|
87
44
|
- 仮にOR検索を含める場合、更に複雑化する。
|
88
45
|
|
89
|
-
|
90
|
-
|
91
46
|
手探りの為、メソッドの継ぎ接ぎにより検索を実現させている状態です。至らぬ点あればご指摘お願いいたします。
|