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='my@email.com' or name like '%John%'

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();

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();

-> 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();

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.