Setara Laravel-5 'LIKE' (Eloquent)

143

Saya menggunakan kode di bawah ini untuk menarik beberapa hasil dari database dengan Laravel 5.

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

Namun, orWhereLike tampaknya tidak cocok dengan hasil apa pun. Apa yang dihasilkan kode itu dalam hal pernyataan MySQL?

Saya mencoba mencapai sesuatu seperti berikut:

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

Jawaban:

380

Jika Anda ingin melihat apa yang dijalankan dalam database gunakan dd(DB::getQueryLog())untuk melihat pertanyaan apa yang dijalankan.

Coba ini

BookingDates::where('email', Input::get('email'))
    ->orWhere('name', 'like', '%' . Input::get('name') . '%')->get();
Pawel Bieszczad
sumber
35
Apakah kueri injeksi sql ini dilindungi?
partho
23
@parto Ya. Laravel menyaring seluruh string yang Anda berikan sebagai argumen ketiga dari wheremetode ini.
Finesse
8
Saat injeksi terlindungi, Anda mungkin ingin memeriksa% yang tidak terduga dari input pengguna. Misalnya, LIKE "% John%" dan LIKE "John%" berkinerja berbeda (Anda mungkin hanya menginginkan yang terakhir). Pertimbangkan juga input kosong, dan kemudian dari "%" saja, yang juga dapat menyebabkan hasil yang tidak diinginkan dari kode di atas.
Ian Fleeton
4
Setuju dengan Ian. Laravel hanya melakukan pelarian sebagian. Masih ada banyak kerusakan yang mungkin terjadi jika Anda tidak melarikan diri dari LIKE. Begini caranya: 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
sumber
-> di mana ('loan_officers', 'like', '%'. $ officerId. '%') di mana loan_officers adalah bidang serial
sadiq rashid
7

Saya memiliki ruang lingkup untuk ini, semoga membantu seseorang.

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

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

Pemakaian:

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

Saya pikir ini lebih baik, mengikuti praktik yang baik untuk melewatkan parameter ke kueri:

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

Anda dapat melihatnya di dokumentasi, Laravel 5.5.

Anda juga dapat menggunakan pengintai Laravel dan membuatnya lebih mudah dengan pencarian. Ini dokumentasinya.

JaredDmz
sumber