
# Gradnik poizvedb

`DocStore` in `SegmentedLog` omogočata `query()`. `DocStore` lahko uporablja sekundarne indekse; `SegmentedLog` uporablja iste pogoje za filtriranje pretočnih zapisov.

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

Uporabne zaključne metode:

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

Pri `DocStore` lahko dva pogoja `eq` za enakost na neunikatnih indeksiranih poljih uporabita samodejno sestavljeno vedro. Posamezna enakost, `in` in operatorji razpona še naprej uporabljajo konfigurirane indekse polj.

Operatorji:

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

`andWhere` in `orWhere` uporabljata povratne klice, ker sta `and` in `or` rezervirani ključni besedi PHP:

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

Verižni klici `where()` se združujejo z AND; vsaka veja `orWhere()` doda alternativo.

## Kako se izvajajo poizvedbe

Vsak pogoj deluje v vsaki zbirki; indeksi vplivajo le na stroške. Pri `DocStore` se `eq` in `in` razrešita prek indeksov enakosti, operatorji razpona in `prefix` prek indeksov razpona, `orderBy` z `limit` na polju z indeksom razpona pa bere v vrstnem redu indeksa. Vse drugo filtrira pregled zapisov. `orderBy` na polju, ki ga načrtovalnik ne more obravnavati z indeksom, razvrsti ujemajoče se zapise v PHP, zato ga pri velikih zbirkah združite z indeksiranimi pogoji. `count()` uporablja število vnosov v indeksu pri `DocStore` in števce v pomnilniku pri `SegmentedLog`, kadar je filter ena sama enakost.

`cursor($id)` omeji rezultate na zapise za danim ID-jem, kar se združi z `page()` za stabilno ostranjevanje, razvrščeno po ID-ju zapisa. Za navadne pretočne filtre brez gradnika glejte [Poizvedbe](https://storh.inline0.dev/sl/docs/queries).
