NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Query Builder for Laravel

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 kryptomien

Odoslaní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.