2017-08-22 12 views
0

私はlaravelの新機能で、アプリに検索機能を実装する方法をいくつか理解しています。Laravelで検索機能を実装する方法5.4

これまでに何を試みましたか?

私は、DBからデータを取得したモデルを作成した(が働いている)

class Post extends Model 
{ 
    public static function scopeSearch($query, $searchTerm) 
    { 
     return $query->where('city', 'like', '%' .$searchTerm. '%') 
        ->orWhere('name', 'like', '%' .$searchTerm. '%'); 
    } 
} 

このように私のコントローラの外観:。

使用のApp \ポスト。

class PostsController extends Controller 
{ 
    public function index(Request $request) 
    { 
     $searchTerm = $request->input('searchTerm'); 
     $posts = Post::all() 
     ->search($searchTerm); 
     return view('posts.index', compact('posts', 'searchTerm')); 
    } 

    public function show($id) 
    { 
     $post = Post::find($id); 
     return view('posts.show', compact('post')); 
    } 
} 

php artisan tinkerモデルが動作しています。私はdbクエリを取得しています。フロントエンドに

私は送信ボタン

<div class="container"> 
    <div class="col-sm-8"> 
     <form action="posts.index" method="GET"> 
      {{csrf_field()}} 
      <div class="input-group"> 
       <input type="text" class="form-control" name="searchTerm" placeholder="Search for..." value="{{ isset($searchTerm) ? $searchTerm : '' }}"> 
       <span class="input-group-btn"> 
        <button class="btn btn-secondary" type="submit">Search</button> 
       </span> 
      </div> 
     </form> 
    </div> 
</div> 

で簡単な入力フィールドを持っていますが、検索入力フィールドにI入力何かあれば、今どのように私は、コントローラからのデータをretriveことができます。コードはすべての投稿を取得したときにのみ機能します。私は、コントローラからserachTerm何とか

@extends('layouts.master') 

@section('content') 
<div class="col-sm-8 blog-main"> 
    @foreach($posts as $post) 
     <div class="card" style="margin-bottom: 10px"> 
      <div class="card-block"> 
       <h3 class="card-title">{{ $post->Name1 }}</h3> 
       <small>Created at: {{ $post->created_at->toFormattedDateString() }}</small> 
       <p class="card-text">With supporting text below as a natural lead-in to additional content.</p> 
       <a href="{{$post->id}}" class="btn btn-primary">Details</a> 
      </div> 
     </div> 
    @endforeach 

</div> 
@endsection 

答えて

2

チェックを含める必要があり、この:

あなただけしようというし、すべてのレコードを取得し、あなたのスコープ関数を適用し、その後、すべてのレコードを取得しようとしている
$posts = Post::search($searchTerm)->get(); 
+0

'Post :: all()'を実行するときにこれを展開するだけで、クエリがすぐに実行されるため、検索クエリのスコープが適用されません。ここでの答えのようにスコープを適用すると、実際にクエリを実行して結果を得るために 'get()'を呼び出さなければなりません。 – jfadich

+0

search()を使用する前に、プロジェクトにlarqavel/scoutを追加してモデルに特性を追加してください。 –

1

$searchTerm = $request->input('searchTerm'); 
$posts = Post::search($searchTerm); 
return view('posts.index', compact('posts', 'searchTerm')); 
0

Laravelは、ライブ結果などのカスタム検索だけでなく、検索も本当に簡単に行います。正面にあるHTTPリクエストを確実に抑制してください 終わり。

/** 
* Get a breed by name (returns similar results) 
* @param $term 
* @return \Illuminate\Http\JsonResponse 
*/ 
public function getBreedByName($term) 
{ 
    // Find an Breed by name 
    $matchedTerm = Breed::where('text', 'LIKE', '%' . $term . '%')->get(); 
    return response()->json($matchedTerm); 
} 

次に、ルート内にそのコントローラとメソッドへの参照を作成します。私の場合、私は、これは便利であると思います/routes/api.php

Route::get('/breeds/search/{term}', '[email protected]'); 

に次のように使用しました!ご不明な点がございましたら、ご質問ください。

関連する問題