From 4b1bb64aa18f2955f32f67532dca23f3df048e92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gardo=C5=88=20V=C3=ADt?= Date: Fri, 25 Sep 2026 06:43:17 +0200 Subject: [PATCH 1/2] Fetching rows as native associate arrays - fetchAllAssoc --- src/Database/Database.php | 12 ++++++++++++ src/Database/Result.php | 22 ++++++++++++++++++++++ tests/types/database-types.php | 6 ++++++ 3 files changed, 40 insertions(+) diff --git a/src/Database/Database.php b/src/Database/Database.php index 8a36bb801..172e81fa9 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -506,6 +506,18 @@ public function fetchAll(#[Language('SQL')] string $sql, #[Language('GenericSQL' } + /** + * Executes SQL query and returns all rows as an array of arrays. + * Useful because the rows can be typed using @var. + * @param literal-string $sql + * @return list + */ + public function fetchAllAssoc(#[Language('SQL')] string $sql, #[Language('GenericSQL')] mixed ...$params): array + { + return $this->query($sql, ...$params)->fetchAllAssoc(); + } + + /** * Creates SQL literal value. */ diff --git a/src/Database/Result.php b/src/Database/Result.php index 276a36004..234eea0fa 100644 --- a/src/Database/Result.php +++ b/src/Database/Result.php @@ -23,6 +23,9 @@ class Result implements \IteratorAggregate /** @var list */ private array $rows; + /** @var list */ + private array $rowsArray; + /** @var array */ private array $meta; @@ -204,6 +207,25 @@ public function fetchAll(): array } + /** + * Returns all remaining rows as array of associative arrays. + * Useful because the rows can be typed using @var. + * @return list + */ + public function fetchAllAssoc(): array + { + if(!isset($this->rowsArray)){ + $this->rowsArray = []; + while(true){ + $data = $this->fetchAssoc(); + if($data === null) break; + $this->rowsArray[] = $data; + } + } + return $this->rowsArray; + } + + private function normalizeRow(array $row): array { $engine = $this->explorer->getDatabaseEngine(); diff --git a/tests/types/database-types.php b/tests/types/database-types.php index 2bce3cf37..e4170d4f6 100644 --- a/tests/types/database-types.php +++ b/tests/types/database-types.php @@ -112,6 +112,12 @@ function testResultSetFetchAll(ResultSet $resultSet): void } +function testResultSetFetchAllAssoc(ResultSet $resultSet): void +{ + assertType('list', $resultSet->fetchAllAssoc()); +} + + function testResultSetFetchPairs(ResultSet $resultSet): void { assertType('array', $resultSet->fetchPairs()); From 488a13dbcadc31de1f7200c7cdbe090eb35cdb21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gardo=C5=88=20V=C3=ADt?= Date: Fri, 25 Sep 2026 06:45:24 +0200 Subject: [PATCH 2/2] Small coding style tweaks --- src/Bridges/DatabaseDI/DatabaseExtension.php | 2 +- src/Database/Table/GroupedSelection.php | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Bridges/DatabaseDI/DatabaseExtension.php b/src/Bridges/DatabaseDI/DatabaseExtension.php index 1cecf30d9..b7ac01e4b 100644 --- a/src/Bridges/DatabaseDI/DatabaseExtension.php +++ b/src/Bridges/DatabaseDI/DatabaseExtension.php @@ -8,11 +8,11 @@ namespace Nette\Bridges\DatabaseDI; use Nette; +use Nette\Database\Table\ActiveRow; use Nette\DI\Definitions\Statement; use Nette\Schema\Expect; use Tracy; use function is_array, is_string; -use Nette\Database\Table\ActiveRow; /** diff --git a/src/Database/Table/GroupedSelection.php b/src/Database/Table/GroupedSelection.php index 96ecd2537..300a2545f 100644 --- a/src/Database/Table/GroupedSelection.php +++ b/src/Database/Table/GroupedSelection.php @@ -7,7 +7,6 @@ namespace Nette\Database\Table; -use Nette; use Nette\Database\Explorer; use function array_keys, count, iterator_to_array, preg_match, reset;