2016-08-09 83 views
4

Ich versuche herauszufinden, wie eine Eloquent-Abfrage dynamisch mithilfe von Benutzereingaben erstellt werden kann, die die Abfrage abhängig von der Länge der Eingabe ändern. Bei Verwendung von straight MySQL ist dies einfach ... Verknüpfen Sie einfach eine Abfragezeichenfolge basierend auf Benutzereingaben. Mit Eloquent ist das nicht möglich, es sei denn, Sie a) verwenden eine "rohe" SQL-Abfrage, die den Zweck der Verwendung von Eloquent oder b) Verwenden Sie etwas sehr ungesund wie eine eval() -Funktion.Laravel Eloquent-Abfrage mit unbekannter Parameteranzahl erstellen

Wie können Sie durch eine Benutzereingabe unbekannter Länge durchlaufen und eine Eloquent Abfrage erstellen, die mehrere Felder für Worte mit Kombinationen von ‚OR‘ und ‚UND‘

Betrachten Sie den folgenden Pseudo-Code, die arbeiten können, nicht wirklich sucht.

$search = "cat sat on the mat"; 
$searchWords = explode(' ', $search); 

$data['finds'] = DB::table('mytable') [... incomplete query] 


foreach ($searchWords as $word) { 
    ->where('firstname', 'like', '%' . $word . '%') 
    ->orWhere('lastname', 'like', '%' . $word . '%') 
    ->orWhere('address', 'like', '%' . $word . '%')->AND [... next word] 
} 

Oder ist es einfach eine Aufgabe, eine rohe Abfrage aufzugeben? Ich könnte eine separate Abfrage für jedes Wort ausführen und dann PHP verwenden, um die Ergebnisse zusammenzuführen/zu manipulieren, aber das erscheint sehr umständlich für das, was in einer Abfrage in herkömmlichem MySQL getan werden kann.

Eine traditionelle MySQL-Abfrage für das, was ich versuche zu tun wäre:

SELECT * FROM `mytable` 
WHERE (firstame LIKE '%$cat%' OR lastname LIKE '%cat%' OR address LIKE '%cat%') 
AND (firstname LIKE '%sat% OR lastname LIKE '%sat%' OR address LIKE '%sat%') 
AND [etc, etc, for all words in user input] 
+0

Ich würde empfehlen, an "Match gegen" natürliche Suche zu denken. Cuz, was versuchst du, ich denke, ist schlechtes Design/Lösung –

+0

@ fred2 Brauchen Sie Hilfe bei dieser Frage? – Alphonsus

+0

@Alphonsus - Ich denke deine Antwort sollte perfekt sein, danke – fred2

Antwort

1

Sie können Gruppe alle where ‚s in der Schleife in einem‚Eltern‘where.

$ query = DB :: tabelle ('mytable');

foreach ($searchWords as $word) { 
    $query->where(function ($query) use ($word) 
    { 
     $query->orWhere('firstname', 'like', '%' . $word . '%'); 
     $query->orWhere('lastname', 'like', '%' . $word . '%'); 
     $query->orWhere('address', 'like', '%' . $word . '%'); 
    }); 
} 

$results = $query->get(); 

Dies führt zu einer SQL-Abfrage ähnlich der gewünschten. Sie können das Raw-SQL-Ergebnis überprüfen, indem Sie $query->toSql() ausdrucken.