質問編集履歴

1

リストの表示変更、コード部分を色付きへ見やすく変更

2022/04/16 03:57

投稿

Y0shito
Y0shito

スコア3

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
- ```laravel
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
  手探りの為、メソッドの継ぎ接ぎにより検索を実現させている状態です。至らぬ点あればご指摘お願いいたします。