Fungsi carian ini adalah carian global. Anda hanya perlu daftarkan Model kerana carian akan dilakukan pada model yang didaftarkan. Secara lazimnya, kod ini akan diletakkan pada Controller (Contoh: app\Http\Controllers\GlobalController.php)
class GlobalController extends Controller{ private $models = [ 'User' => '==User info==', 'Jabatan' => '==Jabatan info==', ]; public function search(Request $request) { $search = $request->input('search'); if ($search === null || !isset($search['term'])) { abort(400); } $term = $search['term']; $searchableData = []; foreach ($this->models as $model => $translation) { $modelClass = 'App\\' . $model; $query = $modelClass::query(); $fields = $modelClass::$searchable; foreach ($fields as $field) { $query->orWhere($field, 'LIKE', '%' . $term . '%'); } $results = $query->take(10) ->get(); foreach ($results as $result) { $parsedData = $result->only($fields); $parsedData['model'] = trans($translation); $parsedData['fields'] = $fields; $formattedFields = []; foreach ($fields as $field) { $formattedFields[$field] = Str::title(str_replace('_', ' ', $field)); } $parsedData['fields_formated'] = $formattedFields; $parsedData['url'] = url('/' . Str::plural(Str::snake($model, '-')) . '/' . $result->id . '/edit'); $searchableData[] = $parsedData; } } return response()->json(['results' => $searchableData]); }}
Daftarkan Static Properties $searchable yang ingin di cari pada model yang berkaitan
// User.phpclass User extends Model{ ... // fungsi carian hanya sasar column ini public static $searchable = [ 'name', 'nokp', 'email', ];}// Jabatan.phpclass Jabatan extends Model{ // fungsi carian hanya sasar column ini public static $searchable = [ 'nama', ];}
Daftarkan route di routes\web.php
Route::get('global-search', 'GlobalController@search')->name('globalSearch');
Untuk mencuba logik carian, masukkan URL berikut pada browser
www.webanda.com/global-search?search[term]=XXX&search[type]=query
{ "results": [ { "name": "TEKNOLOGI STAFF", "nokp": "880808080808", "email": "staff@staff.com", "model": "==Info Ahli==", "fields": [ "name", "nokp", "email" ], "fields_formated": { "name": "Name", "nokp": "Nokp", "email": "Email" }, "url": "http://skp2.test/users/4/edit" }, { "nama": "TEKNOLOGI", "model": "==Info Kad==", "fields": [ "nama" ], "fields_formated": { "nama": "Nama" }, "url": "http://skp2.test/jabatan/41/edit" } ]}
Maklumat carian akan dipaparkan dalam bentuk JSON dan jika anda ingin paparkan pada frontend, anda boleh menggunak script jquery berikut pada fail blade
<script> $(document).ready(function() { $('.searchable-field').select2({ minimumInputLength: 3, ajax: { url: '{{ route("globalSearch") }}', dataType: 'json', type: 'GET', delay: 200, data: function (term) { return { search: term }; }, results: function (data) { return { data }; } }, escapeMarkup: function (markup) { return markup; }, templateResult: formatItem, templateSelection: formatItemSelection, placeholder : 'Carian ahli...', language: { inputTooShort: function(args) { var remainingChars = args.minimum - args.input.length; var translation = 'Masukkan 3 aksara'; return translation.replace(':count', remainingChars); }, errorLoading: function() { return 'Carian tidak boleh dipaparkan'; }, searching: function() { return 'Sedang dicari...'; }, noResults: function() { return 'Tiada maklumat ditemui.'; }, } }); function formatItem (item) { if (item.loading) { return 'Sedang dicari......'; } var markup = "<div class='searchable-link' href='" + item.url + "'>"; markup += "<div class='searchable-title'>" + item.model + "</div>"; $.each(item.fields, function(key, field) { markup += "<div class='searchable-fields'>" + item.fields_formated[field] + " : " + item[field] + "</div>"; }); markup += "</div>"; return markup; } function formatItemSelection (item) { if (!item.model) { return 'Carian ahli...'; } return item.model; } $(document).delegate('.searchable-link', 'click', function() { var url = $(this).attr('href'); window.location = url; }); }); </script>
Diatas ini adalah contoh fungsi global search yang diguna pakai pada element input html