2017-04-10 4 views
1

Ich versuche, eine Suche zu implementieren, so dass Benutzer den Titel eines Buches eingeben kann und Laravel die Datenbank durchsuchen und Ergebnisse anzeigen, die mit einem beliebigen Zeichen übereinstimmen.Aufruf zu undefinierter Methode Illuminate Database Query Builder :: title()

Meine 'Buch' Tabelle enthält ein 'Titel' Feld.

Allerdings, wenn ich Eingang zum Beispiel 'f' ich:

Call to undefined Methode Illuminate \ Database \ Abfrage \ Builder :: Titel()

Search Klinge:

@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 

Einzelheiten = Ergebnisseite:

@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 

Controller:

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')); 
} 

aktualisiert ::

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

Ihre Einbuchtung ist ein Chaos. Sie versuchen, die Modellspalte bei der Abfrage aufzurufen (bevor Sie die Abfrage mit '-> get()'/-'> first() '/' -> paginate() ') irgendwo beenden. – devk

+0

Verwenden Sie entweder '-> get()' oder '-> paginate()', da Sie eine Sammlung in Ihrer Ansicht benötigen. Debuggen Sie auch nur mit 'dd ($ books);', bevor Sie die Ansicht zurückgeben, um zu überprüfen, was von der Abfrage tatsächlich zurückgegeben wird. – Robert

Antwort

0

Sie sollten whereHas() hier nicht verwendet werden, da es Relation verwendet, die Sie nicht haben. Sieht aus wie title eine Spalte in der Tabelle books ist, so tut dies statt:

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

Es wenn $searchTerms in einem Array arbeiten und Sie müssen nur das erste Buch zu finden.

Auch wenn Sie mit dem vollständigen Titel suchen möchten können Sie einfach whereIn() verwenden:

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

Ich habe meinen Controller geändert und bekomme jetzt: Ungültiges Argument für foreach() (View: C: \ xampp \ htdocs \ laraveladvweb \ Ressourcen \ views \ layouts \ details.blade.php) – Przemek

+0

@Przemek überprüft den Inhalt von '$ searchTerms 'mit' dd ($ searchTerms) '. Wenn es leer ist, wickle einfach meinen Code mit etwas wie 'if (! Empty ($)) {}'. Überprüfen Sie es nicht innerhalb der 'where()' Schließung. –

+0

Array: 1 [▼ 0 => "f" ] so bekomme ich die Ausgabe – Przemek

Verwandte Themen