
# Frågebyggare

`DocStore` och `SegmentedLog` exponerar `query()`. `DocStore` kan använda sekundära
index; `SegmentedLog` tillämpar samma predikat på strömmade 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();
```

Användbara 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 två `eq`-villkor för icke-unika likhetsindexerade fält
använda en automatisk sammansatt hink. Enkel likhet, `in` och intervalloperatorer
fortsätter att använda sina konfigurerade fältindex.

Operatorer:

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

`andWhere` och `orWhere` använder återanrop eftersom `and` och `or` är reserverade PHP-nyckelord:

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

Kedjade anrop till `where()` kombineras med AND; varje `orWhere()`-gren lägger till ett
alternativ.

## Så här körs det

Varje villkor fungerar för varje samling; index påverkar bara kostnaden.
På `DocStore` går `eq` och `in` via likhetsindex, intervalloperatorerna och `prefix` går via intervallindex, och `orderBy` med
`limit` på ett intervallindexerat fält läser i indexordning. Allt annat
filtrerar en postskanning. `orderBy` på ett fält som frågeplaneraren inte kan hantera med ett index sorterar de
matchande posterna i PHP, så kombinera det med indexerade villkor för stora samlingar.
`count()` använder antalet indexposter på `DocStore` och räknare i minnet
på `SegmentedLog` när filtret är en enda likhet.

`cursor($id)` begränsar resultaten till poster efter id:t, vilket kombineras med
`page()` för stabil sidnumrering sorterad efter post-id. För vanliga strömningsfilter
utan byggaren, se [Frågor](https://storh.inline0.dev/sv/docs/queries).
