Menggunakan Eloquent ORM di Laravel untuk melakukan pencarian database menggunakan LIKE


94

Saya ingin menggunakan gedung rekaman aktif Eloquent untuk membuat kueri penelusuran, tetapi ini akan menjadi penelusuran LIKE. Saya telah menemukan User::find($term)atau User::find(1), tetapi ini tidak menghasilkan pernyataan serupa. Saya tidak mencari jawaban langsung, tetapi jika seseorang setidaknya bisa memberi saya arahan untuk melihat ke dalam, itu akan bagus!


2
laravel.com/docs/database/eloquent .. Anda dapat menggunakan dokumentasinya dengan sangat jelas.
ytsejam

2
Saya telah melihat halaman ini, saya tidak melihat apa pun tentang pencarian dengan wildcard. Saya juga tidak ingin menyiapkan regex dalam loop foreach karena ada ratusan ribu baris
Jonathan

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

ini disebut pembuat kueri fasih di dokumen.
ytsejam

Jika saya dapat menandai jawaban dan komentar Anda sebagai jawaban, saya akan melakukannya. Terima kasih telah membawa saya ke arah yang benar
Jonathan

Jawaban:


235

Anda dapat melakukan pencarian database menggunakan LIKE dengan sintaks ini:

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

1
tidak begitu efisien, melempar "Kesalahan fatal: Tingkat penyarangan fungsi maksimum '100' tercapai, dibatalkan! di ..."
Sasi varna kumar

@gsk Saya pikir Anda bergabung (menggunakan metode with ()) dan kemudian Anda dapat mencari kolom seperti biasa. Sintaksnya mungkin seperti table.field.
Anthony

64

Jika Anda perlu sering menggunakan LIKE, Anda dapat sedikit menyederhanakan masalah. Metode kustom seperti () dapat dibuat dalam model yang mewarisi ORM yang fasih:

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

Jadi Anda bisa menggunakan metode ini dengan cara seperti ini:

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

Ini adalah cara yang lebih 'Laravel' untuk melakukan ini. Itu hanya lebih bersih dan memungkinkan Anda menyesuaikan ruang lingkup di satu tempat, daripada harus berputar-putar dan menyesuaikan masing-masing ->where().
Daniel Dewhurst

sangat menyukai jawaban ini. Hal ini membuat model dan penggunaannya menjadi sangat elegan yang merupakan inti dari laravel.
deathemperor

29

FYI, daftar operator (berisi like dan lainnya) ada dalam kode:

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

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

penolakan:

Jawaban Joel Larson benar. Dapatkan suara positif saya.

Saya berharap jawaban ini menjelaskan lebih banyak tentang apa yang tersedia melalui ORM yang fasih ( mengarahkan orang ke arah yang benar ). Meskipun tautan ke dokumentasi jauh lebih baik, tautan itu terbukti sulit dipahami.


18

Gunakan tanda kutip ganda, bukan tanda kutip tunggal, misalnya:

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

Di bawah ini adalah kode saya:

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

Jika Anda tidak menyukai tanda kutip ganda seperti saya, ini akan berfungsi untuk Anda dengan tanda kutip tunggal:

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

return view('pages/search/index', compact('books'));
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.