---
title: "Vlastné filtre a triedenia — Query Builder for Laravel | Roundly"
description: "Implementujte kontrakt Filter alebo Sort pre vlastnú logiku a v callbackoch parsujte formát operátorov cez RequestedOperator::split()."
url: https://roundly-consulting.com/sk/open-source/navody/query-builder-for-laravel/vlastne-filtre-a-triedenia
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Query Builder for Laravel](https://roundly-consulting.com/sk/open-source/navody/query-builder-for-laravel.md)

# Vlastné filtre a triedenia

Implementujte kontrakty, pripojte vlastnú logiku a zaregistrujte ju cez AllowedFilter::custom() alebo AllowedSort::custom():

```php
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))
```

```php
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:

```php
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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/query-builder-for-laravel.md)
