0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

プログラミング初心者が挑んだlaravelの検索機能追加

0
Last updated at Posted at 2021-07-02

今回やろうとしたこと

・投稿一覧の中から検索条件に当てはまった投稿だけ表示させたい。
・selectタグを使用した検索がしたい。
・複数条件の絞り込み。

イメージ

formの中にselectタグを二つ用意しその値をコントローラに送りセレクト文で条件に合致する投稿だけ表示させる。

まず、検索する条件内容は変わらないのでjsonファイルに登録しておく。
*jsonファイル

jsonファイル

//今回はゲームの機材は何を使用しているのかとゲームの実力(ランク帯)を条件に検索する
{
	"machine":{
		"PC" : "PC",
		"PS4" : "PS4"
	},
	"lank":{
		"champion" : "チャンピオン",
		"dia" : "ダイア",
		"platina" : "プラチナ",
		"gold" : "ゴールド",
		"silver" : "シルバー",
		"bronze" : "ブロンズ",
		"copper" : "コッパー"
	}
}

続いてControllerを書いていく。

public function search(Request $request){

			// 絶対パスでjsonファイルを指定する
			$url = public_path() ."/json/machin.json";

			// jsonファイルのデータをとってきて$jsonに代入
			$json = file_get_contents($url);
		
			// $json(連想配列)の中身が文字化けしないようにする
			$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
		
			// 第二引数のturuを指定することで連想配列にする
			$arr = json_decode($json,true);	

	}

一旦jsonファイルの中身をController側で取得する処理を書く
続いてviewのform部分を記載していくが、まず下記の認識を合わせておく
①$arrにはjsonファイルに保存しておいたmachineとlankの連想配列がそれぞれ入っている。
②ユーザーが条件を指定しないで検索する場合があるので、その場合は両方のセレクトタグに全選択を用意してあげてvalueにはallを指定しておく。
そうすることで何も指定しなかった場合にはmachineとlankにallの値が入る。

    <form action="{{ route('posts.search') }}">
      <select name="machine">
        <option value="all">全選択</option>
        @foreach($arr["machine"] as $key => $value)
        {{-- machineの連想配列のkeyに入っている値を$valueとして回す --}}
          <option value="{{ $value }}">{{ $value }}
          </option>
        @endforeach
      </select>

      <select name="lank">
        <option value="all">全選択</option>
        @foreach($arr["lank"] as $key => $value)
        {{-- lankの連想配列のkeyに入っている値を$valueとして回す --}}
          <option value="{{ $value }}">{{ $value }}
          </option>
        @endforeach
      </select>
      <button class="aaa" type="submit">検索する</button>
    </form>

viweは完成!!
Controllerに戻りif文のところから追記
まず条件に以下の3点が発生することを想定している
①条件なし
②machineの条件だけ選択されてlankの条件は選択されない(all)
③lankの条件だけ選択されてのmachine条件は選択されない(all)

public function search(Request $request){

			// 絶対パスでjsonファイルを指定する
			$url = public_path() ."/json/machin.json";

			// jsonファイルのデータをとってくる
			$json = file_get_contents($url);
		
			// 連想配列の中身が文字化けしないようにする
			$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
		
			// 第二引数のturuを指定することで連想配列にする
			$arr = json_decode($json,true);	

ーーーーーーーーーーーーーーーー下記を追記ーーーーーーーーーーーーーー

		if($request->machine == $request->lank){
			// 両方指定されていなければ全ての投稿をとってくる。
			$posts = Post::get();

		}elseif($request->lank == 'all'){

			// lankが指定されていなければmachineの選択条件と一致したやつをとってくる
			$posts = Post::where('message',$request->machine)->get();

		}elseif($request->machine == 'all'){

			// machineが指定されていなければlankの選択条件と一致したやつをとってくる
			$posts = Post::where('grade',$request->lank)->get();
			
		}else{
			$posts = Post::where('grade',$request->lank)->where('message',$request->machine)->get();	
		}
		$userId = Auth::id();

		return view('posts.index', compact('posts','userId','arr'));
	}

上記の方法で条件検索処理ができた。
初心者なので説明が下手くそだけどとりあえずコピペして試してみてね。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?