Eine interne Suchfunktion in Laravel erstellen

Damit Besucher einer Webseite die gewünschte Information finden, ist eine interne Suchfunktion hilfreich.

Ich erkläre hier anhand eines Beispiels wie man in Laravel eine interne Suchfunktion erstellen kann. Im Beispiel wird die Suchfunktion einen Blog nach Suchbegriffen durchsuchen und diese Suchergebnisse auf einer Suchergebnisseite präsentieren. 

Damit es funktioniert müssen die Blogbeiträge in einer Datenbank gespeichert sein. 

Will man die interne Suchfunktion nicht selbst programmieren, gibt es für Laravel mit Scout eine Lösung dafür.

Zum Beispiel

1. Ich erstelle eine Datenbanktabelle mit den Namen articles für die Blogbeiträge. Hier die für dieses Beispiel notwendigen Codezeilen der Datenbank Migration:

$table->string('title');
$table->string('excerpt');
$table->text('body');

 

2. Ich erstelle das Suchformular und füge es auf der Blogseite sowie Suchergebnisseite ein:

{!! Form::open(['url' => 'suche', 'method' => 'get']) !!}
        {!! Form::text('search', null, ['class' => 'search-input', 'placeholder' => 'Suche...']) !!}
        {!! Form::button('<i class="fa fa-search fa-2x"></i>', ['type' => 'submit', 'class' => 'search-button']) !!}
{!! Form::close() !!}

Für das Suchsymbol benutze ich Font Awesome, einfach folgende Codezeile im <head> der Webseite einfügen:

<script defer src="https://use.fontawesome.com/releases/v5.0.6/js/all.js"></script>

 

3. Ich erstelle einen Controller um die Ausgabe von der Suchergebnisseite zu steuern:

Ich gehe dafür in den Ordner app\Http\Controllers und erstelle eine neue Datei mit den Namen PagesController.php.

Wichtig: Oben in der Datei muss man das verwendete Model angeben: use App\Article;

In die Datei schreibe ich folgende Funktion rein:

Public function suche(Request $request)
    {
        $search = $request->get('search');
        
        $articles = Article::where('title','like','%'.$search.'%')
        ->where('title','like','%'.$search.'%')
        ->orWhere('excerpt','like','%'.$search.'%')
        ->orWhere('body','like','%'.$search.'%')
        ->orderBy('title')
        ->paginate(10);
        
        $articles->setPath('suche');
        
        return view('pages.suche', compact('articles'));
    }

 

4. Ich erstelle die Suchergebnisseite:

Ich gehe dafür in den Ordner ressources -> views und erstelle einen neuen Ordner mit den Namen pages. In diesen Ordner platziere ich eine neue Datei mit den Namen suche.blade.php.

In die Datei schreibe ich folgenden Code rein:

@section('content')
    <div class="searchform">
    {!! Form::open(['url' => 'suche', 'method' => 'get']) !!}
        {!! Form::text('search', null, ['class' => 'search-input', 'placeholder' => 'Suche...']) !!}
        {!! Form::button('<i class="fa fa-search fa-2x"></i>', ['type' => 'submit', 'class' => 'search-button']) !!}
    {!! Form::close() !!}
    </div>
    
    @foreach ($articles as $article)
        <div class="post">
            <h3 class="title"><a href="{{ url('/blog', $article->slug) }}">{{ $article->title }}</a></h3>
            <div class="entry">
                <p>{!! $article->excerpt !!}</p> 
            </div>
            <p class="postmeta">
                <span class="links"><a href="{{ url('/blog', $article->slug) }}" class="readmore">Lesen Sie mehr</a></span>
            </p>    
        </div>
    @endforeach
    
    @if (count($articles) < 1)
        <p>Keine Suchtreffer, ich habe zu diesen Suchbegriff noch nichts in meinen Blog geschrieben.</p>
    @else
        @unless ($articles < '11')
        <div class="pagination">
        {!! $articles->appends(Request::only('search'))->render() !!}
        </div>
        @endunless
    @endif
@stop

 

5. Ich gebe an unter welcher Webadresse die Suchergebnisseite zu erreichen ist:

Ich gehe dafür in den Ordner routes und öffne die Datei web.php.

In die Datei schreibe ich folgende Codezeile rein:

Route::get('suche', 'PagesController@suche');

Wie die Suchfunktion funktioniert sieht man auf meiner Webseite.

Kommentar eingeben