codewiser / laravel-scout
Laravel Scout 辅助工具
Requires
- php: ^8.1
- laravel/framework: >=10.0
- laravel/scout: >=10.0
Requires (Dev)
Replaces
- codewiser/laravel-meilisearch: ^1.0.5
README
此包允许轻松支持并在应用程序之间切换少量 Scout 驱动器。
主要目标是管理复杂的自定义搜索。
这个简单的例子可以在任何 Scout 驱动器上工作。
$users = User::search('query') ->where('created_at', '>', now()->subYear()) ->orderBy('created_at');
但如果我们需要更复杂的搜索,我们应该通过回调自定义搜索
$users = User::search('query', function () { // Customize search here // Function arguments differs depending on driver }) ->orderBy('created_at');
比如说,我们想根据评论数量过滤用户。首先,我们需要重新配置可搜索的数据
use Illuminate\Database\Eloquent\Model; use Laravel\Scout\Searchable; class User extends Model { use Searchable; /** * Get the indexable data array for the model. * * @return array<string, mixed> */ public function toSearchableArray() { $array = $this->toArray(); // Customize the data array... if (config('scout.driver') == 'meilisearch') { $array['comments_count'] = $this->comments()->count(); } return $array; } }
注意!
database
和collection
驱动器仅适用于自己的模型属性。如果您需要索引外键属性,您应该将它们隔离。
此包提供抽象类,该类为每个驱动器包含自定义搜索。实现 Codewiser\Scout\Concerns\ScoutsDatabase
、Codewiser\Scout\Concerns\ScoutsMeilisearch
、\Codewiser\Scout\Concerns\ScoutsAlgolia
— 根据您想使应用程序支持什么。
use Codewiser\Scout\Concerns\Scout;use Codewiser\Scout\Concerns\ScoutsDatabase;use Codewiser\Scout\Concerns\ScoutsMeilisearch;use Codewiser\Scout\Meilisearch\MeilisearchBuilder;use Illuminate\Database\Eloquent\Builder; class UserScout extends Scout implements ScoutsDatabase, ScoutsMeilisearch { public function __construct(public ?int $min_comments) { // } public function database(Builder $builder) : Builder { return $builder ->has('comments', '>=', $this->min_comments); } public function meilisearch(MeilisearchBuilder $builder) : MeilisearchBuilder { return $builder ->where('comments_count', '>=', $this->min_comments) } }
如您所见,我们提供了具有熟悉界面的 MeilisearchBuilder
,这对于构建 Meilisearch 过滤器很有帮助。
我们已准备好出发
public function index(\Illuminate\Http\Request $request) { $scouter = new UserScout(min_comments: $request->input('filter.min_comments')); $users = User::search('query', $scouter) ->orderBy('created_at'); // Debug search filters dump($scouter->debug()); return $users->paginate(); }
Meilisearch 配置
默认情况下,我们应该在 config/scout.php
中配置 Meiliserach 索引设置:[https://laravel.net.cn/docs/10.x/scout#configuring-filterable-data-for-meilisearch](https://laravel.net.cn/docs/10.x/scout#configuring-filterable-data-for-meilisearch)
use App\Models\User; use App\Models\Flight; 'meilisearch' => [ 'host' => env('MEILISEARCH_HOST', 'https://:7700'), 'key' => env('MEILISEARCH_KEY', null), 'index-settings' => [ User::class => [ 'filterableAttributes'=> ['id', 'name', 'email'], 'sortableAttributes' => ['created_at'], // Other settings fields... ], Flight::class => [ 'filterableAttributes'=> ['id', 'destination'], 'sortableAttributes' => ['updated_at'], ], ], ],
此包允许使用 PHP 属性配置 Meilisearch。
class User extends \Illuminate\Database\Eloquent\Model { use \Laravel\Scout\Searchable; #[MeilisearchFilterableAttributes(['id', 'name', 'email'])] #[MeilisearchSortableAttributes(['created_at'])] public function toSearchableArray() { // } }
然后在 config/scout.php
中列出可搜索的类
use App\Models\User; use App\Models\Flight; 'meilisearch' => [ 'host' => env('MEILISEARCH_HOST', 'https://:7700'), 'key' => env('MEILISEARCH_KEY', null), 'searchable' => [ User::class ], ],
控制台
使用 scout:meilisearch-rebuild
命令完全重建 Meilisearch 索引。