Tương đương với Laravel-5 'THÍCH' (Eloquent)


142

Tôi đang sử dụng đoạn mã dưới đây để lấy một số kết quả từ cơ sở dữ liệu với Laravel 5.

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

Tuy nhiên, orWhereLike dường như không khớp với bất kỳ kết quả nào. Mã đó tạo ra những gì về các câu lệnh MySQL?

Tôi đang cố gắng để đạt được một cái gì đó như sau:

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

Câu trả lời:


379

Nếu bạn muốn xem những gì được chạy trong cơ sở dữ liệu, hãy sử dụng dd(DB::getQueryLog())để xem những truy vấn nào đã được chạy.

Thử cái này

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

35
truy vấn này sql tiêm được bảo vệ?
partho

23
@partho Vâng. Laravel sàng lọc toàn bộ chuỗi mà bạn truyền vào làm đối số thứ ba của wherephương thức.
Phạt tiền

8
Trong khi tiêm được bảo vệ, bạn có thể muốn kiểm tra% bất ngờ trong đầu vào của người dùng. Ví dụ: THÍCH "% John%" và THÍCH "John%" hoạt động khác nhau (bạn chỉ có thể có ý định sau). Cũng xem xét đầu vào trống, và sau đó là "%", điều này cũng có thể dẫn đến kết quả ngoài ý muốn từ mã trên.
Ian Fleeton

4
Đồng ý với Ian. Laravel chỉ thoát được một phần. Vẫn còn rất nhiều trò nghịch ngợm nếu bạn không thoát khỏi THÍCH. Dưới đây là cách thực hiện: 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();

-> nơi ( 'loan_officers', 'như', '%' $ officerId '%'..), nơi loan_officers là lĩnh vực serialized
Sadiq Rashid

7

Tôi có phạm vi cho điều này, hy vọng nó sẽ giúp ai đó.

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

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

Sử dụng:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.