Laravel 複数の値で検索する


やりたいこと


  • 条件を複数指定して検索したい


    • ひとつでもいくつでも検索可能に




追記:コメントから学んだこと


  • Controllerでの値の取得、検索はhasメソッドを使ってコンパクトにできる


    • 検索方法が同じであればonlyメソッドを使ってコンパクトにできる




View


resources\views\example.blade.php

{!! Form::open() !!}

タイトル:{!! Form::text('s_title', $s_title) !!}
カテゴリー:{!! Form::text('s_category', $s_category) !!}
監督:{!! Form::text('s_production', $s_production) !!}
出演:{!! Form::text('s_performer', $s_performer) !!}
{!! Form::submit('検索') !!}
{!! Form::close() !!}

@foreach($movies as $movie)
<div>
<a>{{ $movie->id }}</a>
<a>{{ $movie->title }}</a>
<a>{{ $movie->category }}</a>
<a>{{ $movie->production }}</a>
<a>{{ $movie->performer }}</a>
</div>
@endforeach



Controller


app\Http\Controllers\SearchController.php

<?php

namespace App\Http\Controllers;

use App\Movies;
use Request;

class SearchController extends Controller
{
public function example(Request $request)
{
//コメントでいただいた書き方
//hasメソッドで値が存在、かつ空文字ではないか調べる
if($request->has('s_title'))) {
$query->where('title', 'like', '%'.$request->get('s_title').'%');
}

//自分の書き方
//値の取得と検索を分けている
// 検索条件の値を取得
$s_title = $request->input('s_title');
$s_category = $request->input('s_category');
$s_production = $request->input('s_production');
$s_performer= $request->input('s_performer');

$query = Movies::query();

// もし$s_titleがあれば
if(!empty($s_title)) {
$query->where('title', 'like', '%'.$s_title.'%');
}
// もし$s_categoryがあれば
if(!empty($s_category)) {
$query->where('category', 'like', '%'.$s_category.'%');
}
// もし$s_productionがあれば
if(!empty($s_production)) {
$query->where('production', 'like', '%'.$s_production.'%');
}
// もし$s_performerがあれば
if(!empty($s_performer)) {
$query->where('performer', 'like', '%'.$s_performer.'%');
}

//~~~~~~~省略~~~~~~~

//上記の書き方をいくつも繰り返すのではなく、まとめることができる
//onlyメソッドで取得したい入力データの一部を「配列」として指定
foreach ($request->only(['s_title', 's_category','s_production','s_performer']) as $key => $value) {
$query->where($key, 'like', '%'.$value.'%');
}

//最後にget(
$movies = $query->get();

return view('example')->with('movies', $movies);

}
}