2017-04-10 10 views
1

ユーザーが書籍のタイトルを入力できるように検索を実装しようとしていて、laravelがデータベースを参照して任意の文字に一致する結果を表示します。定義されていないメソッドを呼び出すデータベースクエリビルダー::タイトル()

私の「ブック」テーブルには、「タイトル」フィールドが含まれています。しかし

I取得 'F' 例えばI入力の場合:未定義のメソッドを照らし\ Databaseへ

コール\クエリー\ビルダー::タイトル()

検索刃:

@extends('layouts.master') 

@section('title') 

@section('content') 
    <h1>Search for books</h1> 
    <form action="{{url('details')}}" method="POST"> 
    {{ csrf_field() }} 
     <div> 
      <input type='text' name='book' placeholder='Enter any character' /> 
     </div> 
    <input type="submit" name="submitBtn" value="Search"> 
    </form> 
@endsection 

詳細=結果ページ:

@extends('layouts.master') 

@section('title') 

@section('content') 
    <h1>User Details</h1> 
     <form> 
     <p> 
    <ul> 
     @foreach ($books as $book) 
    <a href= "{{url('reader/'.$book->title)}}"> 
     {{$book->title}}</a> 
     </p> 
</form> 
@endforeach 
    </ul> 
@endsection 

コントローラ:それはあなたが持っていない関係を使用しているため、更新

function search() 
    { 
     $books = Book::all(); 
     return view('layouts/search',['books' => $books]); 
    } 
     function details() { 
      $searchTerms = explode(' ', \Request::input('book')); 
      $books = Book::whereHas('title', function($query) use($searchTerms) { 
       if(!empty($searchTerms)){ 
       for 

each($searchTerms as $book) { 
       $query->where('book', 'LIKE', '%'. $book .'%'); 
      }   
     } 
     })->first(); 
      return view('layouts/details', compact('book')); 
} 

::

function search() 
    { 
     $books = Book::all(); 
     return view('layouts/search',['books' => $books]); 
    } 
     function details() { 
      $searchTerms = explode(' ', \Request::input('book')); 
      $books = Book::where(function($q) use($searchTerms) { 
      foreach ($searchTerms as $book) { 
      $q->orWhere('title', '%'.$book.'%'); 
      } 
     })->first(); 
     return view('layouts/details', compact('books')); 
} 
+0

あなたのインデントは混乱です。どこかで ' - > get()' '/' 'first()'/' - > paginate()'を使ってクエリを終了する前に、モデルのカラムをクエリで呼び出そうとしています。 – devk

+0

ビューにコレクションが必要なので、 ' - > get()'または ' - > paginate()'を使用してください。また、 'dd($ books);'でデバッグするだけで、実際にクエリが返すものを確認するためにビューを返すこともできます。 – Robert

答えて

0

あなたが、ここwhereHas()を使うべきではありません。これは、配列に$searchTerms場合は動作しますし、あなただけの最初の本を見つける必要があり

$books = Book::where(function($q) use($searchTerms) { 
     foreach ($searchTerms as $title) { 
      $q->orWhere('title', '%'.$title.'%'); 
     } 
    }) 
    ->first(); 

titlebooksテーブルの列があるので、代わりにこれを行うように見えます。あなたは完全なタイトルで検索したい場合は

また、あなただけのwhereIn()を使用することができます。

$books = Book::whereIn('title', $searchTerms)->first(); 
+0

私のコントローラを変更したところ、以下のようになりました:foreach()に無効な引数が渡されました(表示:C:\ xampp \ htdocs \ laraveladvweb \ resources \ views \ layouts \ details.blade.php) – Przemek

+0

@Przemekは、 searchTerms'を 'dd($ searchTerms)'と置き換えてください。それが空の場合、 'if(!empty($)){}'のようなもので自分のコードをラップするだけです。 'where()'クロージャの中でチェックしないでください。 –

+0

配列:1 [▼ 0 => "f" ]出力が得られる – Przemek

関連する問題