Laravel-5 'LIKE'-Äquivalent (eloquent)

142

Ich verwende den folgenden Code, um mit Laravel 5 einige Ergebnisse aus der Datenbank abzurufen.

BookingDates::where('email', Input::get('email'))->orWhere('name', 'like', Input::get('name'))->get()

Das orWhereLike scheint jedoch nicht mit den Ergebnissen übereinzustimmen. Was erzeugt dieser Code in Bezug auf MySQL-Anweisungen?

Ich versuche Folgendes zu erreichen:

select * from booking_dates where email='[email protected]' or name like '%John%'
V4n1ll4
quelle

Antworten:

379

Wenn Sie sehen möchten, was in der Datenbank ausgeführt wird, verwenden Sie, um dd(DB::getQueryLog())zu sehen, welche Abfragen ausgeführt wurden.

Versuche dies

BookingDates::where('email', Input::get('email'))
    ->orWhere('name', 'like', '%' . Input::get('name') . '%')->get();
Pawel Bieszczad
quelle
35
Ist diese Abfrage SQL Injection geschützt?
Partho
23
@partho Ja. Laravel überprüft die gesamte Zeichenfolge, die Sie als drittes Argument der whereMethode übergeben.
Finesse
8
Während die Injektion geschützt ist, möchten Sie möglicherweise in der Benutzereingabe nach unerwarteten% suchen. ZB LIKE "% John%" und LIKE "John%" verhalten sich unterschiedlich (möglicherweise beabsichtigen Sie nur Letzteres). Berücksichtigen Sie auch die leere Eingabe und dann nur "%", was ebenfalls zu unbeabsichtigten Ergebnissen aus dem obigen Code führen kann.
Ian Fleeton
4
Einverstanden mit Ian. Laravel entkommt nur teilweise. Es ist immer noch viel Unheil möglich, wenn Sie dem LIKE nicht richtig entkommen. So geht's: stackoverflow.com/a/42028380/329062
Greg
9
$data = DB::table('borrowers')
        ->join('loans', 'borrowers.id', '=', 'loans.borrower_id')
        ->select('borrowers.*', 'loans.*')   
        ->where('loan_officers', 'like', '%' . $officerId . '%')
        ->where('loans.maturity_date', '<', date("Y-m-d"))
        ->get();
Sadiq Rashid
quelle
-> wo ('credit_officers', 'like', '%'. $ offizierId. '%') wo credit_officers das serialisierte Feld ist
sadiq rashid
7

Ich habe Möglichkeiten dafür, hoffe es hilft jemandem.

public function scopeWhereLike($query, $column, $value)
{
    return $query->where($column, 'like', '%'.$value.'%');
}

public function scopeOrWhereLike($query, $column, $value)
{
    return $query->orWhere($column, 'like', '%'.$value.'%');
}

Verwendung:

$result = BookingDates::whereLike('email', $email)->orWhereLike('name', $name)->get();
Oleg
quelle
5

Ich denke, dies ist besser, wenn Sie die bewährten Methoden zum Übergeben von Parametern an die Abfrage befolgen:

BookingDates::whereRaw('email = ? or name like ?', [$request->email,"%{$request->name}%"])->get();

Sie können es in der Dokumentation, Laravel 5.5 sehen.

Sie können auch den Laravel-Scout verwenden und die Suche vereinfachen. Hier ist die Dokumentation.

JaredDmz
quelle