Laravel-5 'LIKE' ที่เทียบเท่า (Eloquent)


143

ฉันใช้โค้ดด้านล่างเพื่อดึงผลลัพธ์บางอย่างจากฐานข้อมูลด้วย Laravel 5

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

อย่างไรก็ตาม orWhereLike ดูเหมือนจะไม่ตรงกับผลลัพธ์ใด ๆ โค้ดนั้นผลิตอะไรในแง่ของคำสั่ง MySQL?

ฉันพยายามที่จะบรรลุสิ่งดังต่อไปนี้:

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

คำตอบ:


380

หากคุณต้องการที่จะเห็นสิ่งที่ทำงานในฐานข้อมูลใช้dd(DB::getQueryLog())เพื่อดูสิ่งที่เรียกใช้แบบสอบถาม

ลองสิ่งนี้

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

35
การฉีด sql แบบสอบถามนี้ป้องกันหรือไม่
ส่วนที่

23
@partho ใช่ Laravel จะตรวจสอบสตริงทั้งหมดที่คุณผ่านเป็นอาร์กิวเมนต์ที่สามของwhereวิธีการ
กลเม็ดเด็ดพราย

8
ในขณะที่การป้องกันการฉีดคุณอาจต้องการตรวจสอบ% ที่ไม่คาดคิดในการป้อนข้อมูลผู้ใช้ เช่น LIKE "% John%" และ LIKE "John%" ดำเนินการแตกต่างกัน (คุณอาจตั้งใจใช้อย่างหลังเท่านั้น) นอกจากนี้ให้พิจารณาอินพุตว่างและจากนั้น "%" เพียงอย่างเดียวซึ่งอาจนำไปสู่ผลลัพธ์ที่ไม่ได้ตั้งใจจากโค้ดด้านบน
Ian Fleeton

4
เห็นด้วยกับเอียน Laravel จะหนีบางส่วนเท่านั้น ยังมีความเสียหายมากมายที่เป็นไปได้หากคุณไม่ได้หลบหนี LIKE อย่างถูกต้อง ต่อไปนี้เป็นวิธี: 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();

-> where ('loan_officers', 'like', '%'. $ officerId. '%') โดยที่ loan_officers เป็นฟิลด์ที่ต่อเนื่องกัน
sadiq rashid

7

ฉันมีขอบเขตสำหรับสิ่งนี้หวังว่าจะมีคนช่วย

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

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

การใช้งาน:

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

5

ฉันคิดว่าสิ่งนี้ดีกว่าต่อไปนี้เป็นแนวทางปฏิบัติที่ดีในการส่งพารามิเตอร์ไปยังข้อความค้นหา:

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

คุณสามารถดูได้ในเอกสารประกอบ Laravel 5.5

คุณยังสามารถใช้ Laravel scout และทำให้การค้นหาง่ายขึ้น นี่คือเอกสาร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.