2017-04-10 130 views
1

我试图执行搜索,以便用户可以输入书的标题,laravel将浏览数据库并显示匹配任何字符的结果。调用未定义的方法Illuminate Database Query Builder :: title()

我的'书籍'表包含'标题'字段。

但是如果我例如 'F' 我得到的输入:

调用未定义的方法照亮\数据库\查询\生成器::标题()

搜索刀片:

@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()这里,因为它使用了你没有关系。貌似titlebooks表中的列,所以这样做,而不是:

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

它会在一个数组,如果$searchTerms工作,你只需要找到的第一本书。

另外,如果你想通过全名来搜索你可以只使用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

相关问题