2016-10-11 16 views
1

Ich bin neu bei Laravel, und ich blieb stecken und versuchte, das Folgende auszuführen. Ich habe eine einfache Benutzer-Tabelle mit den folgenden Spalten:Laravel eloquent - Filter durch Verkettung mehrerer Spalten

  • id
  • first_name
  • last_name

Ich bin über eine Benutzerliste mit einer Option der Filterung zu machen. Einer der Filter ist full_name, aber ich speichere nicht full_name der Benutzer, und ich kann die Tabellenstruktur nicht ändern.

Über ein paar Tagen habe ich dazu kam:

$query = \DB::table('users'); 
$query->select(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`) 
     as `full_name`, id'))->having('full_name', 'LIKE',$input['filter_name']); 
$result = $query->get(['*']); 

Aber es funktioniert nicht.

Spec: Ich benutze die neueste Laravel.

+0

Was funktioniert nicht genau? Erhalten Sie einen Fehler? Lesen Sie dies über Debugging-Abfragen in Laravel: https://scotch.io/tutorials/debugging-queries-in-laravel – haakym

Antwort

0

ich es gelöst. Das erste Problem war, ich habe die Wildcard "%" vergessen.

Die Sekunde, die ein verketteter Wert als Filter verwendet wird, dann hat das Laravels-Paginat versucht, die Gesamtergebniszahl zu zählen, indem dieser verkettete Wert verwendet wurde. Sicher gibt es das nicht. Die Lösung ist:

$query = \App\User::whereDeletedAt(null); 
$query->where(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`)'), 'like', '%' . $input['filter_name'] . '%'); 
$query->paginate(15, ['*'], 'page', 1); 
0

Vielleicht anstatt zu versuchen, es zu erreichen, indem Abfrage Modyfing, Abfrage wie normal erhalten: $users = DB::table('users')->get(); Und dann collections verwenden. ->filter(function($key, $value) { return strpos($value['first_name'].' '.$value['last_name'], $to_find) !== false })->all();

1

Ich glaube, Sie haben die Platzhalter in der LIKE-Anweisung vergessen.

Statt dieser

$query->select(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`) 
    as `full_name`, id'))->having('full_name', 'LIKE',$input['filter_name']); 

Versuchen:

$query->select(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`) 
    as `full_name`, id'))->having('full_name', 'LIKE', '%' . $input['filter_name'] . '%'); 
+0

Ja. Ich habe es zu spät erkannt. Ich habe die '%' Wildcard vergessen ... –

+0

Wenn ich es mit paginate '$ query-> paginate (10, ['*'], 'page', 1)', habe ich den folgenden Fehler: "Spalte nicht gefunden : 1054 Unbekannte Spalte 'full_name' in 'having clause' (SQL: wähle count (*) als Aggregat von 'users' wobei' deleted_at' null ist und 'users'.deleted_at' ist null mit' full_name' LIKE ad% " Es versucht, das Gesamtergebnis zu zählen ... Irgendwelche Lösung dafür? –

+0

@Olaszka Ich denke, der Fehler ist klar. Es weiß nicht, was 'full_name' ist. Ich glaube, Sie vergaß etwas wie ... full_name'. Andernfalls aktualisieren Sie die Frage mit dem neuen Problem. –