Overview
Namespace:FQL\Results
ResultsProvider is the abstract base class for result sets returned by Query::execute(). It implements IteratorAggregate and provides methods to iterate, fetch individual rows, perform aggregate calculations, and export results to a file.
You never instantiate ResultsProvider directly — you receive it from execute().
Subtypes
Query::execute() returns one of two concrete implementations depending on query complexity:
You can force a specific mode by passing the class name to
execute():ResultsProvider interface described below.
Iteration
getIterator()
Returns a Traversable over all result rows. Each row is an associative array.
ResultsProvider implements IteratorAggregate, so you can use it in a foreach loop directly.
Fetching rows
fetchAll()
Yield all rows as a Generator. Optionally hydrate each row into a DTO class.
string | null
Fully qualified class name of a DTO. When provided, each row is mapped to an instance of that class using constructor parameters or public properties.
Generator
Yields associative arrays (or DTO objects when
$dto is set).fetch()
Return the first row only, or null if the result set is empty.
string | null
Optional DTO class name for hydration.
array | object | null
The first row as an associative array, a DTO object, or
null.fetchSingle()
Return a single field value from the first row.
string
required
Field name, including dot-notation for nested fields (e.g.
address.city).mixed
The value of the field, or
null if the row or field does not exist.fetchNth()
Yield every nth row, or every even/odd row.
int | 'even' | 'odd'
required
- Integer: yield every nth row (1-indexed count).
'even': yield rows at even positions (0-indexed: 0, 2, 4…).'odd': yield rows at odd positions (0-indexed: 1, 3, 5…).
string | null
Optional DTO class name.
InvalidArgumentException for invalid $n values.
exists()
Return true if the result set contains at least one row.
Counting
count()
Return the total number of rows in the result set.
Results\Stream caches the count internally after the first call, so repeated count() calls do not re-read the file.Aggregation
Interface:FQL\Interface\Aggregable
The Aggregable interface defines four aggregate methods: sum(), avg(), min(), and max(). It is implemented by Results\Stream and Results\InMemory.
These methods iterate the result set and compute aggregate values. For Results\Stream, computed values are cached so that repeated calls do not re-read the stream.
DescribeResult does not implement Aggregable and does not provide these methods. If you need aggregation on a describe result, run a separate query.sum()
string
required
Field name to sum. Non-numeric values are treated as
0.avg()
string
required
Field name to average.
int
Number of decimal places in the result (default
2).min()
string
required
Field name to find the minimum of.
max()
string
required
Field name to find the maximum of.
Exporting
into()
Write all result rows to a file. The output format is determined by the file extension in the FileQuery string. Returns a FileQuery with the effective query defaults applied, which you can use to read the written file back.
string | FileQuery
required
A file path string (e.g.
output/report.csv) or a FileQuery object. The directory is created automatically if it does not exist.FileQuery | null
A
FileQuery object with defaults applied (ready for reading the written file back), or null when running under EXPLAIN ANALYZE mode. The returned FileQuery contains the effective query path — for example, * for CSV/JSON/NDJSON, or rows.row for XML.FileQueryException, InvalidFormatException, InvalidArgumentException