Laravel-5 'LIKE' eşdeğeri (Eloquent)


143

Laravel 5 ile veritabanından bazı sonuçlar çekmek için aşağıdaki kodu kullanıyorum.

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

Ancak, orWhereLike herhangi bir sonuçla eşleşmiyor gibi görünüyor. Bu kod MySQL ifadeleri açısından ne üretir?

Aşağıdaki gibi bir şey elde etmeye çalışıyorum:

select * from booking_dates where email='my@email.com' or name like '%John%'

Yanıtlar:


380

Veritabanında neyin çalıştırıldığını görmek istiyorsanız, dd(DB::getQueryLog())hangi sorguların çalıştırıldığını görmek için kullanın .

Bunu dene

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

35
Bu sorgu sql enjeksiyon korumalı mı?
partho

23
@partho Evet. Laravel, whereyöntemin üçüncü argümanı olarak ilettiğiniz tüm dizeyi tarar .
incelik

8
Enjeksiyon korumalı durumdayken kullanıcı girişinde beklenmedik% olup olmadığını kontrol etmek isteyebilirsiniz. Örneğin, "% John%" GİBİ ve "John%" GİBİ farklı performans gösterir (yalnızca ikincisini isteyebilirsiniz). Ayrıca, yukarıdaki girdiden istenmeyen sonuçlara yol açabilecek boş girdiyi ve ardından yalnızca "%" değerini de göz önünde bulundurun.
Ian Fleeton

4
Ian ile aynı fikirde. Laravel sadece kısmi kaçış yapar. LIKE'den düzgün bir şekilde kaçmazsanız hala birçok yaramazlık var. İşte
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();

-> burada ('loan_officers', 'like', '%'. $ officerId. '%') burada loan_officers serileştirilmiş alan
sadiq rashid

7

Bunun için kapsamlarım var, umarım birisine yardım eder.

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

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

Kullanımı:

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

5

Parametreleri sorguya geçirme iyi uygulamaları takip ederek, bu daha iyi olduğunu düşünüyorum:

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

Laravel 5.5 belgelerinde görebilirsiniz.

Laravel keşif kolunu da kullanabilir ve arama ile daha kolay hale getirebilirsiniz. İşte belgeler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.