vaened / laravel-criteria
Search engine builder for eloquent
Installs: 8 077
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 1
Forks: 0
Open Issues: 0
Requires
- php: ^8.1
- lambdish/phunctional: ^2.1
- laravel/framework: ^10.21|^v11.15
- vaened/php-criteria-core: ^1.0
- vaened/support: ^4.0
Requires (Dev)
- orchestra/testbench: ^8|^9
- phpunit/phpunit: ^10.4
README
Search engine builder for eloquent
composer require vaened/laravel-criteria
Usage
Turns a php class into a powerful, readable and friendly Query Builder
.
use Flagable, Indexed; public function __construct( private readonly IndexRepository $index, private readonly FlagFiltrator $filter ) { $this->apply(Criterias\PatientDeletionDate::without()); } public function affiliatedBetween(DateTimeInterface $start, DateTimeInterface $end): self { $this->apply(Criterias\PatientAffiliation::between($start, $end)); } public function observationLikeTo(string $observation): self { $this->apply(Criterias\PatientObservation::startsWith($observation)); } public function onlyObserved(): self { $this->apply(Criterias\PatientObservation::isNotNull()); } public function withoutObservation(): self { $this->apply(Criterias\PatientObservation::isNull()); } public function historyEqualsTo(string $clinicHistory): self { $this->apply(Criterias\PatientClinicHistory::equals($clinicHistory)); } public function documentNotEqualsTo(string $documentNumber): self { $this->apply(Criterias\PatientIdentityDocument::notEquals($documentNumber)); } public function inDocuments(array $documentNumbers): self { $this->apply(Criterias\PatientIdentityDocument::in($documentNumbers)); } protected function query(): Builder { return Patient::query(); }
indexed
Query by Index
, evaluate the search strings and determine the index based on the given pattern.
public function indexes(): FilterBag { return FilterBag::open() ->register(PatientIndex::Patient, $this->patientMustBe()) ->register(PatientIndex::Name, $this->nameStartsWith()) ->register(PatientIndex::Document, $this->documentIsEqualsTo()); } protected function documentIsEqualsTo(): Closure { return static fn(string $documentNumber) => PatientIdentityDocument::equals($documentNumber); } protected function nameStartsWith(): Closure { return static fn(string $name) => PatientName::startsWith($name); } private function patientMustBe(): callable { return static fn(string $queryString) => QueryStringMatcher::of( Query::must( target: 'document', mode: FilterOperator::Equal, expression: new NumericFixer(8) ), )->solve($queryString) ?: PatientName::startsWith($queryString); }
Filters
Facility to apply dynamic Filters
through php enumerations.
public function flags(): FilterBag { return FilterBag::open() ->register(PatientFlag::Observed, $this->onlyObserved()) ->register(PatientFlag::WithAccount, $this->onlyWithAccount()); } private function onlyObserved(): Closure { return static fn() => PatientObservation::isNotNull(); } private function onlyWithAccount(): Closure { return static fn() => PatientScope::accounted(); }
More documentation
You can find a lot of comments within the source code as well as the tests located in the tests
directory.