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!

Jonathan
sumber
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();
Joel Larson
sumber
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();
Yaroslav
sumber
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.

dekan grande
sumber
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");
}
Myint Thu Lwin
sumber
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'));
Sinan Eldem
sumber