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.