
# Δημιουργός ερωτημάτων

Τα `DocStore` και `SegmentedLog` προσφέρουν το `query()`. Το `DocStore` μπορεί να χρησιμοποιεί δευτερεύοντα ευρετήρια· το `SegmentedLog` εφαρμόζει τις ίδιες συνθήκες σε εγγραφές που διαβάζονται σε ροή.

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

Χρήσιμες τελικές μέθοδοι:

```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`, δύο συνθήκες `eq` σε πεδία με ευρετήρια ισότητας που δεν επιβάλλουν μοναδικότητα μπορούν να χρησιμοποιήσουν έναν αυτόματο σύνθετο κάδο. Οι μεμονωμένες συνθήκες ισότητας, το `in` και οι τελεστές εύρους συνεχίζουν να χρησιμοποιούν τα διαμορφωμένα ευρετήρια πεδίων τους.

Τελεστές:

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

Τα `andWhere` και `orWhere` χρησιμοποιούν συναρτήσεις επανάκλησης επειδή τα `and` και `or` είναι δεσμευμένες λέξεις-κλειδιά PHP:

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

Οι διαδοχικές κλήσεις `where()` συνδυάζονται με AND· κάθε διακλάδωση `orWhere()` προσθέτει μια εναλλακτική.

## Πώς εκτελούνται τα ερωτήματα

Κάθε συνθήκη λειτουργεί σε κάθε συλλογή· τα ευρετήρια αλλάζουν μόνο το κόστος.
Στα `DocStore`, τα `eq` και `in` επιλύονται μέσω ευρετηρίων ισότητας, οι τελεστές εύρους
και το `prefix` επιλύονται μέσω ευρετηρίων εύρους, ενώ τα `orderBy` με
`limit` σε πεδίο με ευρετήριο εύρους διαβάζουν με τη σειρά του ευρετηρίου. Όλα τα υπόλοιπα
φιλτράρουν μια σάρωση εγγραφών. Το `orderBy` σε πεδίο που ο σχεδιαστής ερωτημάτων δεν μπορεί να εξυπηρετήσει από ευρετήριο ταξινομεί τις
εγγραφές που ταιριάζουν στη PHP, επομένως σε μεγάλες συλλογές συνδυάστε το με συνθήκες που χρησιμοποιούν ευρετήρια.
Το `count()` χρησιμοποιεί πλήθος καταχωρίσεων ευρετηρίου στα `DocStore` και μετρητές στη μνήμη στα
`SegmentedLog`, όταν το φίλτρο είναι μία ισότητα.

Το `cursor($id)` περιορίζει τα αποτελέσματα στις εγγραφές μετά το αναγνωριστικό, κάτι που συνδυάζεται με το `page()` για σταθερή σελιδοποίηση ταξινομημένη κατά αναγνωριστικό εγγραφής. Για απλά φίλτρα ροής χωρίς τον δημιουργό, δείτε την ενότητα [Ερωτήματα](https://storh.inline0.dev/el/docs/queries).
