ใช้ Eloquent ORM ใน Laravel เพื่อค้นหาฐานข้อมูลโดยใช้ LIKE


93

ฉันต้องการใช้การสร้างบันทึกที่ใช้งานอยู่ของ Eloquent เพื่อสร้างคำค้นหา แต่จะเป็นการค้นหาแบบ LIKE ฉันพบUser::find($term)หรือUser::find(1)แต่สิ่งนี้ไม่ได้สร้างคำสั่งที่เหมือนกัน ฉันไม่ได้มองหาคำตอบที่ตรงไปตรงมา แต่อย่างน้อยถ้ามีใครสักคนช่วยชี้ทางให้ฉันดูได้ก็คงจะดีมาก


2
laravel.com/docs/database/eloquent .. คุณสามารถใช้เอกสารประกอบได้ชัดเจนมาก
ytsejam

2
ฉันเคยเห็นหน้านี้ฉันไม่เห็นอะไรเลยเกี่ยวกับการค้นหาด้วยสัญลักษณ์แทน ฉันยังไม่ต้องการตั้งค่า regex ใน foreach loop เนื่องจากมีแถวหลายแสนแถว
Jonathan

$ email = DB :: table ('users') -> where ('id', '=', 1) -> only ('email');
ytsejam

เรียกว่าเครื่องมือสร้างแบบสอบถามที่คล่องแคล่วในเอกสาร
ytsejam

ถ้าฉันสามารถทำเครื่องหมายคำตอบและความคิดเห็นของคุณเป็นคำตอบได้ฉันจะทำ ขอบคุณที่พาฉันไปในทิศทางที่ถูกต้อง
โจนาธาน

คำตอบ:


234

คุณสามารถค้นหาฐานข้อมูลโดยใช้ LIKE ด้วยไวยากรณ์นี้:

Model::where('column', 'LIKE', '%value%')->get();

1
ไม่ค่อยมีประสิทธิภาพแสดงว่า "ข้อผิดพลาดร้ายแรง: ระดับการซ้อนของฟังก์ชันสูงสุดถึง '100' แล้วกำลังยกเลิก! ใน ... "
Sasi varna kumar

@gsk ฉันคิดว่าคุณเข้าร่วม (โดยใช้เมธอด with ()) จากนั้นคุณสามารถค้นหาคอลัมน์ได้ตามปกติ table.fieldไวยากรณ์อาจจะเป็นสิ่งที่ต้องการ
Anthony

64

หากคุณจำเป็นต้องใช้ LIKE บ่อยๆคุณสามารถลดความซับซ้อนของปัญหาได้เล็กน้อย สามารถสร้างเมธอดแบบกำหนดเองเช่น () ในโมเดลที่สืบทอด Eloquent ORM:

public  function scopeLike($query, $field, $value){
        return $query->where($field, 'LIKE', "%$value%");
}

ดังนั้นคุณสามารถใช้วิธีนี้ในลักษณะดังกล่าว:

User::like('name', 'Tomas')->get();

นี่เป็นวิธี 'Laravel' มากขึ้นในการทำเช่นนี้ มันสะอาดกว่าและช่วยให้คุณปรับขอบเขตได้ในที่เดียวแทนที่จะต้องไปรอบ ๆ และปรับแต่ละ->where()ส่วน
Daniel Dewhurst

รักคำตอบนี้จริงๆ สิ่งนี้ทำให้โมเดลและการใช้งานดูหรูหรามากซึ่งเป็นสิ่งที่เกี่ยวกับ laravel
deathemperor

29

FYI รายชื่อตัวดำเนินการ (ประกอบด้วยlikeและอื่น ๆ ทั้งหมด) อยู่ในรหัส:

/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php

protected $operators = array(
    '=', '<', '>', '<=', '>=', '<>', '!=',
    'like', 'not like', 'between', 'ilike',
    '&', '|', '^', '<<', '>>',
    'rlike', 'regexp', 'not regexp',
);

ข้อจำกัดความรับผิดชอบ:

คำตอบของ Joel Larson ถูกต้อง ได้รับคะแนนโหวตของฉัน

ฉันหวังว่าคำตอบนี้จะให้ความกระจ่างมากขึ้นเกี่ยวกับสิ่งที่มีอยู่ผ่าน Eloquent ORM ( ชี้ให้ผู้คนเห็นในทางตรง ) ในขณะที่เชื่อมโยงไปยังเอกสารจะไกลดีกว่าการเชื่อมโยงที่ได้พิสูจน์ตัวเองที่เข้าใจยาก


18

ใช้เครื่องหมายคำพูดคู่แทนคำพูดเดี่ยวเช่น:

where('customer.name', 'LIKE', "%$findcustomer%")

ด้านล่างนี้คือรหัสของฉัน:

public function searchCustomer($findcustomer)
{
    $customer = DB::table('customer')
                  ->where('customer.name', 'LIKE', "%$findcustomer%")
                  ->orWhere('customer.phone', 'LIKE', "%$findcustomer%")
                  ->get();

    return View::make("your view here");
}

3

หากคุณไม่ชอบคำพูดคู่เหมือนฉันสิ่งนี้จะใช้ได้กับคุณด้วยคำพูดเดี่ยว:

$value = Input::get('q');
$books = Book::where('name', 'LIKE', '%' . $value . '%')->limit(25)->get();

return view('pages/search/index', compact('books'));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.