fab2s / searchable
Laravel searchable models based on FullText indexes
Installs: 32 747
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 1
Forks: 0
Open Issues: 0
Requires
- php: ^8.0
- fab2s/strings: ^1.0
Requires (Dev)
- ext-pdo: *
- friendsofphp/php-cs-fixer: ^3.0
- orchestra/testbench: ^7.0
- phpunit/phpunit: ^9.0
This package is auto-updated.
Last update: 2024-10-30 02:16:17 UTC
README
Searchable models for Laravel (The Awesome) based on Mysql FullText indexes.
This package does not try to be smart, just KISS. It will allow you to make any filed of your model searchable by concatenating them into a new column indexed with a mysql FullText index.
It requires mysql / mariadb and Laravel 9.x
Installation
Searchable
can be installed using composer:
composer require "fab2s/searchable"
Usage
To start using Searchable
on a specific model
, just use
the Searchable
trait and setup $searchables
:
class MyModel extends Model { use Searchable; /** * @var string[] */ protected $searchables = [ 'field1', 'field2', // ... 'fieldN', ]; }
By default, field1
to fieldN
will be concatenated and stored into the default SearchQuery::SEARCHABLE_FIELD
field added to the model by the Enable
command.
By default, this searchable field will be of type VARCHAR(255)
, but you can customize it at will with any type and length supporting a FullText index by just overriding the Searchable
trait method in your model:
/** * @return string */ public function getSearchableField(): string { return SearchQuery::SEARCHABLE_FIELD; // searchable } /** * @return string any migration method such as string, text etc ... */ public function getSearchableFieldDbType(): string { return 'string'; } /** * @return int */ public function getSearchableFieldDbSize(): int { return 255; }
You can customise concatenation as well overriding:
/** * @param string $additional for case where this method is overridden in users * * @return string */ public function getSearchableContent(string $additional = ''): string { return TermParser::prepareSearchable(array_map(function ($field) { return $this->$field; }, $this->getSearchables()), $additional); }
The $additional
parameter can be used to preprocess model data if needed, can be handy to encrypt/decrypt or anonymize for example:
/** * @return string */ public function getSearchableContent(): string { $additional = [ $this->decrypt('additional_field1'), 0 . substr((string) $this->decrypt('phone'), 3, 6), // will allow for partial matches ]; return $this->getSearchableContentTrait(implode(' ', $additional)); }
Once you have configured your model(s), you can use the Enable
command to add the searchable
field to your models and / or index them:
$ php artisan searchable:enable --help Description: Enable searchable for your models Usage: searchable:enable [options] Options: --root[=ROOT] The place where to start looking for models, defaults to Laravel's app/Models --index To also index / re index -h, --help Display help for the given command. When no command is given display help for the list command -q, --quiet Do not output any message -V, --version Display this application version --ansi|--no-ansi Force (or disable --no-ansi) ANSI output -n, --no-interaction Do not ask any interactive question --env[=ENV] The environment the command should run under -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Stopwords
Searchable
comes with an english and french stop words files which you can use to reduce FullText indexing by ignoring words listed in these files.
The StopWords
command can be used to populate a stopwords
table with these words:
php artisan searchable:stopwords
The db server configuration must be configured as demonstrated in innodb_full_text.cnf for these words to effectively be excluded from indexing.
Contributing
Contributions are welcome, do not hesitate to open issues and submit pull requests.
License
Searchable
is open-sourced software licensed under the MIT license.