【Laravel】複数条件のキーワード＆絞り込み検索フォームを作る。（複数テーブルから取得）


はじめに。出来上がりはこんな感じ。
![スクリーンショット (18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574195/87867c6e-722c-689d-fde1-47b94516f42f.png)


##`やりたいこと`##

- laravelで検索フォームを作る
- 曲名とアーティスト名を入力したらキーワード検索＆絞り込みしてDBから取得する

##`前提`##
- データベースは作成済みとして進めます

##`進めかた`##
- テーブルの作成
- Controllerの作成
- viewの作成


テーブル構成
-
####artistsテーブル

|id|name|       
|---|---|
||||
||||
||||
####songsテーブル 

|id|name|artist_id|       
|---|---|---|---|
||||
||||
||||


Controller
-

```php:SongController.php

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use \App\Song;
use \App\Artist;

class SongController extends Controller
{
    public function search(Request $request){
　　　　　 //フォームから送られてきた値を取得
       $song_keyword = $request->input('song_keyword');
       $artist_keyword = $request->input('artist_keyword');
　　　　　 //ふたつの値が空じゃないか判定
       if(!empty($song_keyword) && !empty($artist_keyword)){
　　　　　 //もし空じゃなけれDBからlikeを使ってキーワード検索
          $song   = Song::where('name','like','%'.$song_keyword.'%')->first();
          $artist = Artist::where('name','like','%'.$artist_keyword.'%')->first(); 
          //キーワード検索して該当するデータが２つともあるならidを取得　　　　　 
          if($song && $artist){
             $song = $song->id; 
             $ids  = $artist->id;
　　　　　 //songsテーブルのidに$songと同じidがあり、かつartist_idに$idsと同じidがあるカラムを検索し取得
             $song = Song::where('id',$song)->where('artist_id',$ids)->orderBy('id','asc')->paginate(30);
　　　　　 //検索結果の$songが空じゃないか判定（ここではCollection配列になるのでisEmpty()で判定する
             if($song->isEmpty()){
　　　　   //空ならnullをviewに渡す
                return view('song.song_find',['songs'=>null,'song_keyword'=>$song_keyword,'artist_keyword'=>$artist_keyword]);
                }
          //空じゃなかったら値をviewに渡す
              return view('song.song_find',['songs'=>$song,'song_keyword'=>$song_keyword,'artist_keyword'=>$artist_keyword]);
             }
          //キーワード検索して該当するデータが２つ揃わなかったらnullをviewに渡す
            return view('song.song_find',['songs'=>null,'song_keyword'=>$song_keyword,'artist_keyword'=>$artist_keyword]);
        　//フォームから送られてきた値が楽曲だけの場合の処理
        }else if(!empty($song_keyword)){
            $song = Song::where('name','like','%'.$song_keyword.'%')->orderBy('id','asc')->paginate(30);
            if($song->isEmpty()){
                return view('song.song_find',['songs'=>null,'song_keyword'=>$song_keyword,'artist_keyword'=>'']);
            }else{
                return view('song.song_find',['songs'=>$song,'song_keyword'=>$song_keyword,'artist_keyword'=>'']);
            }
　　　　　　//フォームから送られてきた値がアーティスト名だけの場合の処理
        }else if(!empty($artist_keyword)){
            $artist = Artist::where('name','like','%'.$artist_keyword.'%')->first();
           if($artist){
                $ids = $artist->id;
                $artist = Song::where('id_artist',$ids)->orderBy('id','asc')->paginate(30);
            }
        return view('song.artist_find',['artists'=>$artist,'artist_keyword'=>$artist_keyword,'song_keyword'=>'']);
        }
    }

```

正直if文使いすぎてわけが分かりません。。w

viewの作成
-

```php:song/song_find.blade.php
@extends('layouts.ksongapp')
@section('title', '楽曲検索詳細')
@section('content')

<div class="page-header" style="margin-top:-30px;padding-bottom:0px;">
    <h1><small>楽曲検索詳細</small></h1>
    <form class="form-horizontal find" action = "{{ url('/') }}/song/find" method="post"  class="form-horizontal">
    @csrf
        <div class="form-group">
           <input type="text" name="song_keyword" value="{{$song_keyword}}" >
           <input type="submit" value="検索" >
        </div>
        <div class="form-group">
           <input type="text" name="artist_keyword" value="{{$artist_keyword}}" placeholder="アーティスト名を入力">
           <input type="submit" value="検索" >
        </div>
    </form>
</div>
<div class="songs">
   @if(!empty($songs))
   <table class="table table-striped table-hover">
      <tr>
          <th>楽曲ID</th><th>楽曲名</th><th>アーティスト名</th>
      </tr>
      @foreach($songs as $song)
          <tr>
              <td>{{$song->id}}</td>
              <td><a href="{{ url('/') }}/song/show?id={{$song->id}}" >{{$song->name}}</a></td>
              <td><a href="{{ url('/') }}/artist/show?id={{$song->artists->id}}" >{{$song->artists->name}}</a></td>
              <td>
              <button class="btn btn-warning btn-sm" onclick="location.href='{{ url('/') }}/song/show?id={{$song->id}}'">詳細</button>
              <button class="btn btn-primary btn-sm" onclick="location.href='{{ url('/') }}/song/edit?id={{$song->id}}'">編集</button>
              <button class="btn btn-danger btn-sm btn-dell" onclick="location.href='{{ url('/') }}/song/del?id={{$song->id}}'">削除</button>
              <button class="btn btn-success btn-sm " onclick="location.href='{{ url('/') }}/song/csv?id={{$song->id}}'">CSVダウンロード</button>
              </td>
           </tr>
       @endforeach
    </table>
    @else
        <p>データがみつかりません</p>
    @endif
</div>
@endsection

```

```php:song/artist_find.php
@extends('layouts.ksongapp')
@section('title', '楽曲検索詳細')
@section('content')

<div class="page-header" style="margin-top:-30px;padding-bottom:0px;">
   <h1><small>楽曲検索詳細</small></h1>
   <form class="form-horizontal find" action = "{{ url('/') }}/song/find" method="post"  class="form-horizontal">
    @csrf
       <div class="form-group">
          <input type="text" name="song_keyword" value="{{$song_keyword}}" >
          <input type="submit" value="検索" >
       </div>
       <div class="form-group">
          <input type="text" name="artist_keyword" value="{{$artist_keyword}}" placeholder="アーティスト名を入力">
          <input type="submit" value="検索" >
       </div>
    </form>
</div>

<div class="songs">
    @if(isset($artists))
    <table class="table table-striped table-hover">
        <tr>
            <th>アーティスト</th><th>楽曲ID</th><th>楽曲名</th>
        </tr>
        @foreach($artists as $artist)
            <tr>
                <td><a href="{{ url('/') }}/artist/show?id={{$artist->artists->id}}" >{{$artist->artists->name}}</a></td>
                <td>{{$artist->id}}</td>
                <td><a href="{{ url('/') }}/song/show?id={{$artist->id}}" >{{$artist->name}}</a></td>
                <td>                
                <button class="btn btn-warning btn-sm" onclick="location.href='{{ url('/') }}/song/show?id={{$artist->id}}'">詳細</button>
                <button class="btn btn-primary btn-sm" onclick="location.href='{{ url('/') }}/song/edit?id={{$artist->id}}'">編集</button>
                <button class="btn btn-danger btn-sm btn-dell" onclick="location.href='{{ url('/') }}/song/del?id={{$artist->id}}'">削除</button>
                <button class="btn btn-success btn-sm " onclick="location.href='{{ url('/') }}/song/csv?id={{$artist->id}}'">CSVダウンロード</button>
                </td>
            </tr>
        @endforeach
    </table>
    @else
    <p>データがみつかりません</p>
    @endif
</div>
@endsection

```

以上です。Collectionの返り値の判定に苦労しました。。