根據 Laravel 官方文件 及 Laravel 台灣翻譯文件 | Laravel 道場 介紹,Laravel Scout 套件預設使用 Algolia Driver ,但也可以使用其它 Driver,例如:ElasticSearch、MySQL或者磁碟資料方式。
到 Algolia 建立一個帳號
Algolia 免費提供 10,000 SEARCH REQUESTS/MONTH,對於測試的開發,相當足夠,另外還對新建立的帳號,提供 14 天最高等級的免費使用。註冊完成後會取得 Application ID 及 Admin API Key。
安裝 Laravel Scout 及 Algolia
# 安裝
composer require laravel/scout
# 產生設定檔
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
# 安裝 Algolia 驅動 Driver
composer require algolia/algoliasearch-client-php
修改 .env
# Laravel Scout
SCOUT_DRIVER=algolia
# 如果需要使用隊列改為true並設定jobs
SCOUT_QUEUE=false
ALGOLIA_APP_ID=
取得的Application ID
ALGOLIA_SECRET=取得的Admin API Key
將 Laravel\Scout\Searchable trait 新增到你想要進行的搜尋模型中。
這邊我使用台北市公園資料來當作範例:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
//直接使用記錄功能
use Spatie\Activitylog\Traits\LogsActivity;
//使用 Scout 做搜尋
use Laravel\Scout\Searchable;
class Park extends Model
{
use LogsActivity;
use Searchable;
//可新增編輯的欄位名稱
protected $fillable = [
'name', 'engname', 'overview', 'lat', 'lon',
'dist', 'location', 'type', 'area', 'unit',
'onlinedate', 'offlinedate', 'isshow', 'istop', 'sort'
];
// //要記錄的欄位 ['*'] 全部
protected static $logAttributes = ['*'];
// //若使用 $logAttributes = ['*'] 時可使用來忽略某些欄位異動不啟用紀錄
// // protected static $logAttributesToIgnore = [ 'type'];
// //只記錄有改變的欄位
// protected static $logOnlyDirty = true;
// //無異動資料則不增加空資料,若沒設定 $ogOnlyDirty = true 時使用
// protected static $submitEmptyLogs = false;
// //log_name 欄位資料
protected static $logName = '公園資料';
/**
* 取得模型的索引名稱。
*
* @return string
*/
public function searchableAs()
{
return 'parks_index';
}
}
將現有資料送入 Algolia
php artisan scout:import "App\Park"
到 Algolia 帳號中可以看到,資料已經被推送進來。
使用 ThinkPHP 測試
php artisan tinker
use App\Park;
$parks = App\Park::search('大安森林公園')->get();
新增路由
Route::get('search', 'ParksController@search')->name('search');
新增表單
<form action="{{ route('parks.search') }}" method="GET" class="form-inline" role="search">
<div><span>資料搜尋</span>
<input type="search" class="form-control form-control-sm mr-sm-2 ml-2" name="keyword" value="{{ $keyword ?? '' }}" placeholder="輸入關鍵字" aria-label="Search">
<button type="submit" class="btn btn-sm btn-outline-info my-2 my-sm-0">
<i class="fas fa-search"></i>
搜尋
</button>
</div>
</form>
新增 function
/*
台北市公園資訊 搜尋功能
*/
public function search(Request $request)
{
$keyword = $request->keyword;
$parks = ParkEloquent::search($keyword)->get();
return view('parks.index',compact('parks','keyword'));
}