
# Užklausų kūrimo priemonė

`DocStore` ir `SegmentedLog` suteikia `query()`. `DocStore` gali naudoti antrinius indeksus; `SegmentedLog` taiko tuos pačius predikatus srautu skaitomiems įrašams.

```php
$records = $docs
    ->query()
    ->where('kind')->eq('page')
    ->where('status')->in(['draft', 'published'])
    ->where('publishedAt')->between($from, $until)
    ->orderBy('publishedAt', 'desc')
    ->limit(50)
    ->get();
```

Naudingi pabaigos metodai:

```php
$docs->query()->where('slug')->eq('home')->first();
$docs->query()->where('kind')->eq('page')->count();
$docs->query()->cursor($lastId)->page(100)->get();
$docs->query()->where('slug')->eq('home')->explain();
```

Naudojant `DocStore`, dvi `eq` sąlygos neunikaliuose laukų lygybės indeksuose gali naudoti automatinį jungtinį segmentą. Viena lygybės sąlyga, `in` ir intervalų operatoriai toliau naudoja sukonfigūruotus laukų indeksus.

Operatoriai:

- `eq`, `neq`
- `in`, `notIn`
- `gt`, `gte`, `lt`, `lte`, `between`
- `exists`, `missing`
- `prefix`
- `andWhere`, `orWhere`
- `orderBy`, `limit`, `cursor`, `page`

`andWhere` ir `orWhere` naudoja atgalinio iškvietimo funkcijas, nes `and` ir `or` yra rezervuoti PHP raktažodžiai:

```php
$docs->query()
    ->where('kind')->eq('page')
    ->orWhere(fn ($q) => $q->where('kind')->eq('post')->where('featured')->eq(true))
    ->get();
```

Sujungti `where()` iškvietimai jungiami AND sąlyga; kiekviena `orWhere()` šaka prideda alternatyvą.

## Kaip vykdomos užklausos

Kiekviena sąlyga veikia su bet kuria kolekcija; indeksai keičia tik vykdymo sąnaudas. Naudojant `DocStore`, `eq` ir `in` sprendžiami per lygybės indeksus, intervalų operatoriai ir `prefix` – per intervalų indeksus, o `orderBy` su `limit` pagal intervalų indeksą turintį lauką skaito indekso tvarka. Visa kita filtruoja įrašų peržiūrą. Jei `orderBy` naudoja lauką, kurio planuoklis negali apdoroti per indeksą, atitinkami įrašai rikiuojami atmintyje naudojant PHP, todėl didelėse kolekcijose šį metodą derinkite su indeksuotomis sąlygomis. `count()` naudoja indekso įrašų skaičių `DocStore` atveju ir skaitiklius atmintyje `SegmentedLog` atveju, kai filtras yra viena lygybės sąlyga.

`cursor($id)` apriboja rezultatus įrašais po nurodyto ID; kartu su `page()` tai užtikrina stabilų puslapiavimą pagal įrašo ID. Apie paprastus srautinio filtravimo metodus be užklausų kūrimo priemonės skaitykite skyriuje [Užklausos](https://storh.inline0.dev/lt/docs/queries).
