2017-02-07 5 views
1

Ich arbeite mit einem typischen Account-> Postleitzahl Szenario. Ich habe 2 model2: Account und Postleitzahl, in Konto ich hinzufügenLaravel eifrig laden und LIKE Filter

public function zipcode() { 
    return $this->belongsTo(Zipcode::class); 
} 

Die index.blade.php ist wie folgt:

<td>{{$account->id}}</td> 
    <td>{{$account->fullname}}</td> 
    <td>{{$account->address}}</td> 
    <td>{{$account->zipcode->fulllocation}}</td> 
... 

ich einen Filter (Basic Input Text oben auf der Liste hinzufügen) für eine Zeichenfolge in accounts.fullname enthielt so ist die Steuerung wie folgt aus:

public function index(Request $request) 
{ 
    $search = $request->search; 
    //The instructions in the closure given to when() will only be applied if the first argument is evaluated to true 
    $accounts = Account::with('zipcode')//https://laravel.com/docs/4.2/eloquent#eager-loading 
        ->when($search,function ($query) use ($search) { 
        $query->where('fullname','like','%'.$search.'%'); 
        return $query; 
        }) 
        ->latest() 
        ->paginate(15); 
    return view('accounts.index', compact('accounts'))->with('search',$search); 
} 

an diesem Punkt in dem Szenario getestet und funktioniert, wenn keine Suche wird alle eingefügt accounts werden aufgelistet, ansonsten wird das Ergebnis korrekt gefiltert.

Mein Bedürfnis ist es, die eingefügt Zeichenfolge in accounts.fullname OR accounts.zipcode.fulllocation zu suchen. Ich versuche, die Controller auf diese Weise zu modifizieren:

$accounts = Account::with('zipcode')//https://laravel.com/docs/4.2/eloquent#eager-loading 
    ->when($search,function ($query) use ($search) { 
       $query->where('fullname','like','%'.$search.'%'); 

       $query->orWhere('fulllocation','like','%'.$search.'%');//ADDED THIS 

       return $query; 
      }) 
    ->latest() 
    ->paginate(15); 

Wenn ich es versuchen, diese Fehler ausgelöst:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'fulllocation' in 'where clause' (SQL: select count(*) as aggregate from `accounts` where `fullname` like %foo% or `fulllocation` like %foo%) 

Dank jede Art von Hilfe.

Antwort

3

Der Grund, warum Sie diesen Fehler erhalten, ist, weil die Abfrage nach fulllocation in der Kontentabelle sucht, wenn es tatsächlich in der zipcodes Tabelle ist.

$query->where('fullname', 'like', '%' . $search . '%') 
    ->orWhereHas('zipcode', function ($q) use ($search) { 
     $q->where('fulllocation', 'like', '%' . $search . '%'); 
    }); 

https://laravel.com/docs/5.3/eloquent-relationships#querying-relationship-existence

this helps:

Sie könnte so etwas wie versuchen!

+0

es ist genau das, was ich brauche und was ich suche. Eigentlich beginne ich, das Account-Modell basierend auf MySql-Tabelle und Zipcode-Modell basierend auf ** Oracle ** -Tabelle zu konfigurieren. Wenn Sie Ihre Lösung anwenden, wird ein Fehler ausgegeben, weil die Abfrage nicht den Befehl ** mysqlschema.zipcode ** findet. In diesem Moment muss ich nicht so komplex sein, so dass ich alles auf mysql verschiebe und es korrekt funktioniert (an der Seite von Laravel ändert sich nichts). Ich halte diesen Fall für weitere Studien. – AlexMI