2017-05-29 2 views
1

でlaravel検索を取得する私は現在、私は私のアプリでtitle,category & locationフィールドを持っていると私は、ユーザーが選択することで、結果を取得できるようにしたい、マルチオプションで私のウェブサイトの検索結果を取得したい、マルチオプション

をlaravel 5.4を使用しています例えば、あるユーザがロケーションベース検索を選択しただけで、他のオプションを満たしていないというエラーを出さずに結果を得ることができる場合など、これらのフィールドのいずれか。

問題。 私がタイトルフィールドだけで作業する前に、うまくいきましたが、他の2つのオプションを定義すると、categories & locationsの結果はもう戻らなくなります。私のミスはどこですか?

screenshot

これは私のコントローラである:

public function search() { 
     $q = Input::get('q'); 
     $ads = null; 
     $categories = null; 
     $locations = null; 
     if($q) { 
      $categories = Category::where('name','LIKE','%'.$q.'%') 
       ->paginate(2) 
       ->appends('q', $q); 
     } 
     if($q) { 
      $locations = Location::where('name','LIKE','%'.$q.'%') 
       ->paginate(2) 
       ->appends('q', $q); 
     } 
     if($q) { 
      $ads = Ad::where('title','LIKE','%'.$q.'%') 
       ->orWhere('description','LIKE','%'.$q.'%') 
       ->paginate(2) 
       ->appends('q', $q); 
     } 
     return view('search-result', compact('ads', 'categories', 'locations', 'q')); 
    } 

私のルート:

//search routes 
Route::any('/search', '[email protected]'); 

私の見解:

@extends('layouts.view') 

@section('content') 

@if(isset($ads)) 
<h2>Search results</h2> 
<table class="table table-striped"> 
    <thead> 
     <tr> 
      <th>Name</th> 
      <th>Email</th> 
     </tr> 
    </thead> 
    <tbody> 
     @foreach($ads as $ad) 
     <tr> 
      <td>{{$ad->title}}</td> 
      <td>{{$ad->description}}</td> 
     </tr> 
     @endforeach 
    </tbody> 
</table> 
@else 
no results! 
@endif 
@endsection 

更新:

私のコントローラとの関係:

use Illuminate\Http\Request; 
use App\Events\StudentAdded; 
use App\Ad; 
use App\Company; 
use App\Location; 
use App\Category; 
use Carbon\Carbon; 
use Illuminate\Support\Facades\Input; 

モデル: 場所モデル

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Location extends Model 
{ 

    protected $fillable = [ 
     'name', 
    ]; 

    public function ads(){ 
    return $this->hasMany(Ad::class); 
    } 
} 

カテゴリーモデル:

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Category extends Model 
{ 

    protected $fillable = ['name']; 

    public function ads(){ 
    return $this->hasMany(Ad::class); 
    } 

} 

広告モデル

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Ad extends Model 
{ 

    protected $fillable = [ 
     'company_id', 'title', 'slug', 'image', 'description', 'address', 'job_title', 'salary', 
    ]; 

    public function company(){ 
     return $this->belongsTo(Company::class); 
    } 
    public function category(){ 
     return $this->belongsTo(Category::class); 
    } 
    public function location(){ 
     return $this->belongsTo(Location::class); 
    } 
    public function employment(){ 
     return $this->belongsTo(Employment::class); 
    } 
} 

アップデート2:

検索フォーム:あなたのページ分割のリンクに検索クエリを追加しているので

<form class="form-inline myform" action="/search" method="POST" role="search"> 
      {{ csrf_field() }} 
      <div class="input-group" data-toggle="tooltip" data-placement="top" title="Title"> 
       <span class="input-group-addon" id="basic-addon1"><i class="fa fa-pencil"></i></span> 
       <input name="q" type="text" class="form-control" placeholder="Title" aria-describedby="basic-addon1"> 
      </div> 

      <label data-toggle="tooltip" data-placement="top" title="select category" class="sr-only mr-sm-2" for="inlineFormCustomSelect">Category</label> 
      <select name="q" data-toggle="tooltip" data-placement="top" title="select category" class="custom-select mb-2 mr-sm-2 mb-sm-0" id="inlineFormCustomSelect"> 
       @foreach ($categories as $category) 
       <option value="{{ $category->id }}">{{ $category->name }}</option> 
       @endforeach 
      </select> 

      <label data-toggle="tooltip" data-placement="top" title="select City" class="sr-only mr-sm-2" for="inlineFormCustomSelect">City</label> 
      <select name="q" data-toggle="tooltip" data-placement="top" title="select City" class="custom-select mb-2 mr-sm-2 mb-sm-0" id="inlineFormCustomSelect"> 
       @foreach ($locations as $location) 
       <option value="{{ $location->id }}">{{ $location->name }}</option> 
       @endforeach 
      </select> 

      <button type="submit" class="btn btn-primary">Submit</button> 
      </form> 
+0

あなたのコントローラを見ると、あなたは関係を利用していません。モデル関係と検索フォームを共有します。 – Sandeesh

+0

テーブル内に外部キーの宣言が見つかりません。広告モデルでの場所とカテゴリの外部キーとは何ですか? – Muthu17

+0

これらはIDのDBタブです。 – djhru

答えて

1

、おそらくあなたの形式でGETを使用する必要があります。次に、すべての検索入力を同じ名前で渡そうとしています。検索を簡単にするために入力名を変更しました。以下に示すコードでは、3つの入力を使用して適切な広告を取得するためのクエリを作成しています。 3つの入力のいずれかが提供されると、データベースから広告を取得するために使用されます。 1つ以上の入力が提供された場合、提供されるすべての条件が適用されます。

ビュー

<form class="form-inline myform" action="/search" method="GET" role="search"> 
    {{ csrf_field() }} 
    <div class="input-group" data-toggle="tooltip" data-placement="top" title="Title"> 
     <span class="input-group-addon" id="basic-addon1"><i class="fa fa-pencil"></i></span> 
     <input name="title" type="text" class="form-control" placeholder="Title" aria-describedby="basic-addon1"> 
    </div> 

    <label data-toggle="tooltip" data-placement="top" title="select category" class="sr-only mr-sm-2" 
      for="inlineFormCustomSelect">Category</label> 
    <select name="category" data-toggle="tooltip" data-placement="top" title="select category" 
      class="custom-select mb-2 mr-sm-2 mb-sm-0" id="inlineFormCustomSelect"> 
      <option value="">Select category</option> 
     @foreach ($categories as $category) 
      <option value="{{ $category->id }}">{{ $category->name }}</option> 
     @endforeach 
    </select> 

    <label data-toggle="tooltip" data-placement="top" title="select City" class="sr-only mr-sm-2" 
      for="inlineFormCustomSelect">City</label> 
    <select name="location" data-toggle="tooltip" data-placement="top" title="select City" 
      class="custom-select mb-2 mr-sm-2 mb-sm-0" id="inlineFormCustomSelect"> 
      <option value="">Select Location</option> 
     @foreach ($locations as $location) 
      <option value="{{ $location->id }}">{{ $location->name }}</option> 
     @endforeach 
    </select> 

    <button type="submit" class="btn btn-primary">Submit</button> 
</form> 

コントローラ

public function search() 
{ 
    $searchTitle = request('title'); 
    $searchCategory = request('category'); 
    $searchLocation = request('location'); 

    $ads = null; 

    if($searchTitle || $searchCategory || $searchLocation) { 
     $ads = Ad::when($searchTitle, function ($query) use ($searchTitle) { 
       return $query->where('title', 'like', "%{$searchTitle}%") 
        ->orWhere('description', 'like', "%{$searchTitle}%"); 
      }) 
      ->when($searchCategory, function ($query) use ($searchCategory) { 
       return $query->whereHas('category', function ($query) use ($searchCategory) { 
        $query->where('id', $searchCategory); 
       }); 
      }) 
      ->when($searchLocation, function ($query) use ($searchLocation) { 
       return $query->whereHas('location', function ($query) use ($searchLocation) { 
        $query->where('id', $searchLocation); 
       }); 
      }) 
      ->paginate(2) 
      ->appends(request()->query()); 
    } 

    return view('search-result', compact('ads')); 
} 

私はあなたの検索結果ページでのカテゴリと場所を必要とするかはわかりません。しかし、必要な場合は、広告関係を使用して取得することも、入力値に基づいてすべての場所を取得することもできます。それはかなり簡単で、私はあなたがそれを行うことができると思います。

+0

私はこれらのコードを試しましたが、唯一変わったのは、タイトルの検索は、場所やカテゴリを追加する前と同じですが、タイトルを空のままにしてカテゴリや場所の検索結果ベースを取得しようとすると、 – djhru

+0

私はすべてのカテゴリと場所をループするので別の問題があると思います。なぜなら、常に1つのオプションが選択されているからです。それらのそれぞれに空のオプションを追加すると、選択された場合にだけサークルを検索します。 – djhru

+0

'dd(request() - > all());'を検索メソッドに追加し、入力を使って検索を実行するときに内容を表示できますか? – Sandeesh