Vlastné filtre a triedenia
Implementujte kontrakty, pripojte vlastnú logiku a zaregistrujte ju cez AllowedFilter::custom() alebo AllowedSort::custom():
use Illuminate\Database\Eloquent\Builder;
use RoundlyConsulting\QueryBuilder\Contracts\Filter;
final class EvenViewsFilter implements Filter
{
public function apply(Builder $query, mixed $value, string $property): void
{
$query->whereRaw('views % 2 = 0');
}
}
// ...->allowedFilters(AllowedFilter::custom('even', new EvenViewsFilter))use Illuminate\Database\Eloquent\Builder;
use RoundlyConsulting\QueryBuilder\Contracts\Sort;
use RoundlyConsulting\QueryBuilder\Enums\SortDirection;
final class TitleLengthSort implements Sort
{
public function apply(Builder $query, SortDirection $direction, string $property): void
{
$query->orderByRaw('LENGTH(title) '.$direction->value);
}
}
// ...->allowedSorts(AllowedSort::custom('length', new TitleLengthSort))Kontrakty
- Filter::apply(Builder $query, mixed $value, string $property): void — $value je už normalizovaná (zoznamy oddelené čiarkami sú polia; true/false ostávajú textom, pokiaľ filter nezaregistrujete cez custom(…, booleans: true)); $property je interný názov.
- Sort::apply(Builder $query, SortDirection $direction, string $property): void — $direction->value je asc alebo desc.
Operátory v callbacku
Keď callback musí sám rešpektovať formát operátorov, neparsujte ho ručne — RequestedOperator::split() robí to isté rozdelenie ako vstavané filtre. Zoznam $allowed je celá bezpečnostná hranica: token mimo neho nie je operátor a celý reťazec sa vráti ako hodnota:
use Illuminate\Database\Eloquent\Builder;
use RoundlyConsulting\QueryBuilder\Enums\RequestedOperator;
AllowedFilter::callback('priority', function (Builder $query, mixed $value, string $property): void {
if (! is_string($value)) {
return;
}
$parsed = RequestedOperator::split($value, [RequestedOperator::Is, RequestedOperator::Not]);
$parsed->operatorOr(RequestedOperator::Is) === RequestedOperator::Not
? $query->where($property, '!=', $parsed->value)
: $query->where($property, $parsed->value);
}),
// ?filter[priority]=high → priority = 'high'
// ?filter[priority]=not:high → priority != 'high'
// ?filter[priority]=gte:high → priority = 'gte:high' (gte was not allowed)split() vráti RequestedFilterValue: jeho operator je null, keď request žiadny neuviedol (čo nie je to isté ako uviesť is), a operatorOr($default) ho doplní. Pre viachodnotové parametre vráti RequestedFilterValues::parse($raw, $allowed) operátor aj zoznam neprázdnych hodnôt.
Textové vyhľadávanie
Ak vlastný filter skladá vlastné LIKE, escapujte vstup rovnako ako vstavané filtre: RoundlyConsulting\PackageToolkit\Support\LikeEscaper::escape() zo závislosti package-toolkit escapuje %, _ a \ — a doplňte explicitnú klauzulu ESCAPE, pretože SQLite nemá predvolený escape znak.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.