
# Forespørgselsbygger

`DocStore` og `SegmentedLog` stiller `query()` til rådighed. `DocStore` kan bruge sekundære
indekser; `SegmentedLog` anvender de samme betingelser på streamede poster.

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

Nyttige terminalmetoder:

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

På `DocStore` kan to `eq`-betingelser på ikke-unikke felter med lighedsindeks
bruge en automatisk sammensat bucket. Enkelt lighed, `in` og intervaloperatorer
fortsætter med at bruge deres konfigurerede feltindekser.

Operatorer:

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

`andWhere` og `orWhere` bruger callbacks, fordi `and` og `or` er reserverede PHP-nøgleord:

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

Kædede `where()`-kald kombineres med AND; hver `orWhere()`-gren tilføjer et
alternativ.

## Sådan udføres forespørgsler

Alle betingelser virker på alle samlinger; indekser ændrer kun omkostningen.
På `DocStore` løses `eq` og `in` via lighedsindekser, intervaloperatorerne og `prefix` løses via intervalindekser, og `orderBy` med
`limit` på et felt med intervalindeks læser i indeksrækkefølge. Alt andet
filtrerer en postscanning. `orderBy` på et felt, som planlæggeren ikke kan hente fra et indeks, sorterer de
matchende poster i PHP, så brug den sammen med indekserede
betingelser i store samlinger. `count()` bruger antal indeksindgange på `DocStore` og tællere i hukommelsen på `SegmentedLog`, når filteret er en enkelt lighed.

`cursor($id)` begrænser resultaterne til poster efter id'et og kan kombineres med
`page()` for stabil sideinddeling sorteret efter post-id. Se [Forespørgsler](https://storh.inline0.dev/da/docs/queries) for almindelige streamingfiltre
uden forespørgselsbyggeren.
