– 複数の入力フォームから、ユーザの入力値に応じて、belongsToのテーブルも検索したい
### blade
{!! Form::open(['method'=>'POST', 'action'=>'SearchController@index']) !!}
// 省略
{!! Form::close() !!}
### model
public function user(){
return $this->belongsTo('App\User');
}
### route
Route::match(['get','post'],'/search', 'SearchController@index');
### controller
– Data::query()->whereHas(‘user’, function($q){})で検索する
– 検索時にユーザ入力の変数で検索したい場合は、whereHas(‘user’, function($q) use($inputs){} として、渡す
public function index(Request $request){
if($request->isMethod('post')){
$inputs = $request->all();
$query = Data::query();
if(!empty($inputs['start'])){
$query->where('start_at','>=', date('Y-m-d', strtotime($inputs['start'])) );
}
// 省略
// 名前検索
if(!empty($inputs['name'])){
$works = $query->whereHas('user', function($q) use($inputs){
$q->where('last_name','like', '%'.$inputs['name'].'%')->orWhere('first_name','like', '%'.$inputs['name'].'%');
})->orderBy('start','ASC')->paginate(10);
} else {
$data = $query->orderBy('start','ASC')->paginate(10);
}
} else {
$data = Data::whereMonth('start', '=', date('m'))->orderBy('start','ASC')->paginate(10);
}
// 省略
whereHas(‘user’, function($q, $inputs){} で上手く行きそうな気がしたのですがエラーに成ります。
入力フォームの設置順に検索するのではなく、DBのリレーション順に検索をかけるので、注意が必要です。