
# Vaicājumu veidotājs

`DocStore` un `SegmentedLog` nodrošina `query()`. `DocStore` var izmantot sekundāros indeksus; `SegmentedLog` piemēro tos pašus nosacījumus straumētiem ierakstiem.

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

Noderīgas termināļa metodes:

```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();
```

`DocStore` gadījumā divus `eq` nosacījumus laukiem ar vienādības indeksu, kas nav unikāli, var apstrādāt ar automātisku saliktu kopu. Atsevišķa vienādība, `in` un diapazona operatori turpina izmantot konfigurētos lauku indeksus.

Operatori:

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

`andWhere` un `orWhere` izmanto atzvanīšanas funkcijas, jo `and` un `or` ir rezervēti PHP atslēgvārdi:

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

Ķēdē savienoti `where()` izsaukumi tiek apvienoti ar AND; katrs `orWhere()` atzars pievieno alternatīvu.

## Kā notiek izpilde

Katrs nosacījums darbojas ar katru kolekciju; indeksi maina tikai izmaksas.
`DocStore` gadījumā `eq` un `in` izmanto vienādības indeksus, diapazona operatori un `prefix` — diapazona indeksus, bet `orderBy` ar `limit` laukā, kuram ir diapazona indekss, nolasa ierakstus indeksa secībā. Pārējos gadījumos tiek skenēti un filtrēti ieraksti. Ja lauka `orderBy` plānotājs nevar apstrādāt, izmantojot indeksu, atrastie ieraksti tiek sakārtoti PHP vidē, tāpēc lielās kolekcijās apvienojiet to ar indeksētiem nosacījumiem. Ja filtrs ir viena vienādība, `count()` izmanto indeksu ierakstu skaitu `DocStore` kolekcijās un atmiņā uzturētus skaitītājus `SegmentedLog` kolekcijās.

`cursor($id)` ierobežo rezultātus, iekļaujot tikai ierakstus pēc norādītā ID. Apvienojiet to ar `page()`, lai nodrošinātu stabilu lapošanu pēc ierakstu ID. Vienkāršus straumēšanas filtrus bez veidotāja skatiet sadaļā [Vaicājumi](https://storh.inline0.dev/lv/docs/queries).
