From b2a10193e14eb5dffc6bdcb6c4a56516847ced81 Mon Sep 17 00:00:00 2001 From: Alex Pott <alex.a.pott@googlemail.com> Date: Mon, 20 Apr 2020 00:47:40 +0100 Subject: [PATCH] Issue #2956556 by johndevman, daffie, Neslee Canil Pinto, dan.munn, aleevas, dubcanada, alexpott: class isn't set in FETCH_OBJECT when class_name isn't set --- .../Drupal/Core/Database/StatementPrefetch.php | 5 ++++- .../KernelTests/Core/Database/FetchTest.php | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/core/lib/Drupal/Core/Database/StatementPrefetch.php b/core/lib/Drupal/Core/Database/StatementPrefetch.php index 814653b3ce2b..4294b72d26ef 100644 --- a/core/lib/Drupal/Core/Database/StatementPrefetch.php +++ b/core/lib/Drupal/Core/Database/StatementPrefetch.php @@ -417,7 +417,10 @@ public function fetchObject($class_name = NULL, $constructor_args = []) { } else { $this->fetchStyle = \PDO::FETCH_CLASS; - $this->fetchOptions = ['constructor_args' => $constructor_args]; + $this->fetchOptions = [ + 'class' => $class_name, + 'constructor_args' => $constructor_args, + ]; // Grab the row in the format specified above. $result = $this->current(); // Reset the fetch parameters to the value stored using setFetchMode(). diff --git a/core/tests/Drupal/KernelTests/Core/Database/FetchTest.php b/core/tests/Drupal/KernelTests/Core/Database/FetchTest.php index a8b25c54bd4c..b0023ec0b82f 100644 --- a/core/tests/Drupal/KernelTests/Core/Database/FetchTest.php +++ b/core/tests/Drupal/KernelTests/Core/Database/FetchTest.php @@ -80,6 +80,23 @@ public function testQueryFetchClass() { $this->assertIdentical(count($records), 1, 'There is only one record.'); } + /** + * Confirms that we can fetch a record into a class using fetchObject. + * + * @see \Drupal\system\Tests\Database\FakeRecord + * @see \Drupal\Core\Database\StatementPrefech::fetchObject + */ + public function testQueryFetchObjectClass() { + $records = 0; + $query = $this->connection->query('SELECT name FROM {test} WHERE age = :age', [':age' => 25]); + while ($result = $query->fetchObject(FakeRecord::class)) { + $records += 1; + $this->assertInstanceOf(FakeRecord::class, $result); + $this->assertSame('John', $result->name, '25 year old is John.'); + } + $this->assertSame(1, $records, 'There is only one record.'); + } + /** * Confirms that we can fetch a record into a new instance of a custom class. * The name of the class is determined from a value of the first column. -- GitLab