2016-07-28 20 views
2

Ich implementiere eine Suche mit Laravel und Ajax. Ich habe also ein Produkt, das zu einem Tag und einer Unterkategorie gehört. Auf der anderen Seite gehört die Unterkategorie zu einer Kategorie. Ich möchte alle ihre Eigenschaften (Feldwerte) überprüfen und überprüfen, ob sie die angegebene Zeichenfolge enthalten. Mit etwas Suchen habe ich herausgefunden, dass ich LIKE verwenden muss. Hier ist, was ich versucht habe:Laravel - Abfrage Modell, wenn Werte eine bestimmte Zeichenfolge enthalten (aus der Sucheingabe)

$products = Product::where('name_en', 'LIKE', $search)->get(); 

Allerdings wird dies die Produkte erhalten, wenn die Suchzeichenfolge genau dem Wert entspricht. Ich möchte übereinstimmen, wenn es es enthält. Wie kann ich mit den "angles To" Beziehungen fortfahren? Wie kann ich die Eigenschaften von Tag und Subcategory überprüfen? Wie verkette ich alles zusammen, um das gewünschte Ergebnis zu erzielen? Danke im Voraus.

Antwort

9

Sie tun eine Sache falsch, Ihre Abfrage gibt Ihnen genaue Übereinstimmungen zurück, weil Sie die genaue Zeichenfolge angegeben haben. Aber Ihre Abfrage sollte so sein.

Obige Abfrage gibt Ihre Produkte, die die gesuchte Zeichenfolge enthält.

Und wenn Sie in relationalen Tabellen suchen möchten, dann können Sie Benutzer Laravel Methode join(). Aber es gibt eine weitere Methode whereHas, aber ich vermeide immer diese Methode, weil es sehr komplexe Abfrage erstellt. Das ist sehr schwer. So können Sie join() Methode verwenden, die inner join mit relationalen Tabelle hinzufügen wird. Hier

ist das Beispiel beitreten:

$products = Product::join('tags', function($builder) { 
         $builder->on('tags.id', '=', 'products.tag_id'); 
         // here you can add more conditions on tags table. 
        }) 
        join('sub_categories', function($builder) { 
         $builder->on('sub_categories.id', '=', 'products.tag_id'); 
         // here you can add more conditions on subcategories table. 
        }) 
        ->where('name_en', 'LIKE', '%'.$search.'%') 
        ->get(); 

Dies ist die grundlegende Beispiel können Sie diese entsprechend Ihrer Anforderung verwenden.

+0

Sie sind wirklich hilfreich. Danke für die Information. Könnten Sie Ihre Frage aktualisieren und mir ein Beispiel mit Join geben? Du wirst mir noch mehr helfen. Vielen Dank. – Codearts

+0

@Codearts aktualisiert ein Beispiel, ich denke, das wird Ihnen helfen. und stimme auch diese Antwort ab, wenn hilfreich :) –

3

zu Lakhwinder Singh ‚s Antwort hinzuzufügen, es könnte es sich lohnen, bis in einem Bereich Verpackung, die Sie auf Ihr Modell anwenden können:

class Product extends Model 
{ 
    public function scopeSearch($query, $keywords) 
    { 
     return $query->where('name_en', 'LIKE', '%'.$keywords.'%'); 
    } 
} 

Sie können dann diesen Bereich wie folgt verwenden:

$products = Product::search($keywords)->get(); 

Das bedeutet, Sie müssen nicht manuell "LIKE" Bedingungen in Ihrer Anwendung hinzufügen.

Als Neben Laravel der Einführung von Scout, eine Fahrer-basierte Volltextsuche Erweiterung für Eloquent, in der Version 5.3.

0

Was Sie wollen, ist eine erweiterte Abfrage schreiben Produkt zu basierend auf ähnlichen Modellen zu suchen, so wie in früheren Vorschlag von anderen, müssen Sie Aussagen beitreten schreiben.

unter meinem Beispielcode prüfen, was geschrieben steht Mitgliedern zu suchen, der Suchbegriff auch Mitglieder bringen, wenn die Zeichenfolge übereinstimmt, die Mitglieder Fähigkeiten oder Positionen, so dass dies wird sicher helfen.

$users = User::select('app_users.*') 
      ->distinct() 
      ->join('app_members', 'app_users.id', '=', 'app_members.app_users_id') 
      ->leftJoin('app_members_jobtitles', 'app_members.id', '=', 'app_members_jobtitles.app_members_id') 
      ->leftJoin('app_jobtitles', 'app_members_jobtitles.app_jobtitles_id', '=', 'app_jobtitles.id') 

      ->leftJoin('app_members_tags', 'app_members.id', '=', 'app_members_tags.app_members_id') 
      ->leftJoin('app_technologies', 'app_members_tags.app_technologies_id', '=', 'app_technologies.id') 
      ->whereNull('app_users.activation') 
      ->where('app_users.block','=',0) 
      ->where(function ($query)use ($search) { 
       $query->orWhere('app_users.first_name', 'like', '%'.$search.'%') 
         ->orWhere('app_users.last_name', 'like', '%'.$search.'%') 
         ->orWhere('app_members.company', 'like', '%'.$search.'%') 
         ->orWhere('app_members.job_title', 'like', '%'.$search.'%') 
         ->orWhere('app_jobtitles.title', 'like', '%'.$search.'%') 
         ->orWhere('app_technologies.title', 'like', '%'.$search.'%') 
         ->orWhere('app_members.summary', 'like', '%'.$search.'%'); 
      }) 
      ->get(); 

Notieren Sie sich die in dem obigen Code verbinden folgenden, die in Ihrem Fall Kategorie und Unterkategorie

->leftJoin('app_members_jobtitles', 'app_members.id', '=', 'app_members_jobtitles.app_members_id') 
     ->leftJoin('app_jobtitles', 'app_members_jobtitles.app_jobtitles_id', '=', 'app_jobtitles.id') 
0

Wenn Sie die Kontrolle über den Wert nicht in $search, ist es wichtig, sich zu schützen gegen SQL injection.

Ein guter Weg, dies zu tun, ist wie folgt:

$products = Product::whereRaw('name_en LIKE', ['%'.$search.'%'])->get();