PHP
laravel
laravel5

Laravel 複数の値で検索する

やりたいこと

  • 条件を複数指定して検索したい
    • ひとつでもいくつでも検索可能に

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

  • Controllerでの値の取得、検索はhasメソッドを使ってコンパクトにできる
    • 検索方法が同じであればonlyメソッドを使ってコンパクトにできる

View

resources\views\example.blade.php
{!! Form::open(['method' => 'POST']) !!}
    タイトル:{!! 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)
    {
        //自分の書き方(値の取得と検索を分けている)
        // 検索条件の値を取得
        $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.'%');
        }

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

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

       //上記の書き方をいくつも繰り返すのではなく、まとめることができる
       //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);

    }
}