Tips laravel kali ini saya akan memberi contoh kode sederhana untuk Searching database pakai Query Builder di laravel.
Misal kita ingin melakukan Search pada sebuah table sebut saja tabel 'artikel' . mungkin ada sebelumnya ada yang meng-Kode seperti ini
//MyModel.php public static function getSearch($search=null){ //is_publish : 0 = pending, 1 = published $result = DB::table('article') ->where('article.is_publish','1') ->where('article.title','LIKE','%'.$search.'%') ->orWhere('article.content', 'LIKE','%'.$search.'%') ->select('*') ->orderBy('article.id', 'desc')->paginate(10); return $result;}
Scenario Query diatas adalah mencari Artikel DIMANA artikel itu sudah di Publish (is_publish =1 ) DAN judul artikel seperti '%...%' ATAU konten artikel seperti '%...%' .
SELECT * FROM `article` WHERE `article`.`is_publish` = '1' AND `article`.`title` LIKE '%search%' OR `article`.`content` LIKE '%search%'...
Query diatas tidak error tapi akan memunculkan hasil yang salah dimana Artikel yang is_publish = 0 juga ikut muncul. Untuk membuatnya benar, kita harus membuat kode seperti berikut
public static function getSearch($search=null){ //is_publish : 0 = pending, 1 = published $result = DB::table('article') ->where('article.is_publish','1') ->where(function($query) use ($search){ $query->where('article.title','LIKE','%'.$search.'%') ->orWhere('article.content', 'LIKE','%'.$search.'%'); }) ->select('*') ->orderBy('article.id', 'desc')->paginate(10); return $result;}
Kode diatas akan menghasilkan Raw query berikut
SELECT * FROM `article` WHERE `article`.`is_publish` = '1' AND (`article`.`title` LIKE '%search%' OR `article`.`content` LIKE '%search%')...
Perhatikan bahwa kita harus menggunakan Closure
.... ->where(function($query) use ($search){ $query->where('article.title','LIKE','%'.$search.'%') ->orWhere('article.content', 'LIKE','%'.$search.'%'); })
sebab kita mengakses variable diluar fungsi.