From 9a925e45876e40b6fd4cfcdbf3e1abc49c1d627b Mon Sep 17 00:00:00 2001 From: vlakoff Date: Mon, 27 Jun 2016 15:57:16 +0200 Subject: [PATCH] [5.2] Properly support PDO::FETCH_CLASS in cursor() (#14052) * Use variable * Properly support PDO::FETCH_CLASS in cursor() * Refine handling of PDO::FETCH_CLASS without class name * Adjustment in testAlternateFetchModes() --- src/Illuminate/Database/Connection.php | 24 +++++++++++++++++------ tests/Database/DatabaseConnectionTest.php | 4 ++-- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/Illuminate/Database/Connection.php b/src/Illuminate/Database/Connection.php index eade5d34edc8..c6ca41d7b3ba 100755 --- a/src/Illuminate/Database/Connection.php +++ b/src/Illuminate/Database/Connection.php @@ -334,11 +334,16 @@ public function select($query, $bindings = [], $useReadPdo = true) $statement->execute($me->prepareBindings($bindings)); + $fetchMode = $me->getFetchMode(); $fetchArgument = $me->getFetchArgument(); - return isset($fetchArgument) ? - $statement->fetchAll($me->getFetchMode(), $fetchArgument, $me->getFetchConstructorArgument()) : - $statement->fetchAll($me->getFetchMode()); + if ($fetchMode === PDO::FETCH_CLASS && ! isset($fetchArgument)) { + $fetchArgument = 'StdClass'; + } + + return isset($fetchArgument) + ? $statement->fetchAll($fetchMode, $fetchArgument, $me->getFetchConstructorArgument()) + : $statement->fetchAll($fetchMode); }); } @@ -359,10 +364,17 @@ public function cursor($query, $bindings = [], $useReadPdo = true) $statement = $this->getPdoForSelect($useReadPdo)->prepare($query); - if ($me->getFetchMode() === PDO::FETCH_CLASS) { - $statement->setFetchMode($me->getFetchMode(), 'StdClass'); + $fetchMode = $me->getFetchMode(); + $fetchArgument = $me->getFetchArgument(); + + if ($fetchMode === PDO::FETCH_CLASS && ! isset($fetchArgument)) { + $fetchArgument = 'StdClass'; + } + + if (isset($fetchArgument)) { + $statement->setFetchMode($fetchMode, $fetchArgument, $me->getFetchConstructorArgument()); } else { - $statement->setFetchMode($me->getFetchMode()); + $statement->setFetchMode($fetchMode); } $statement->execute($me->prepareBindings($bindings)); diff --git a/tests/Database/DatabaseConnectionTest.php b/tests/Database/DatabaseConnectionTest.php index 791162472e02..5605ece538f4 100755 --- a/tests/Database/DatabaseConnectionTest.php +++ b/tests/Database/DatabaseConnectionTest.php @@ -300,7 +300,7 @@ public function testAlternateFetchModes() $stmt->expects($this->exactly(3))->method('fetchAll')->withConsecutive( [PDO::FETCH_ASSOC], [PDO::FETCH_COLUMN, 3, []], - [PDO::FETCH_CLASS, 'stdClass', [1, 2, 3]] + [PDO::FETCH_CLASS, 'ClassName', [1, 2, 3]] ); $pdo = $this->getMock('DatabaseConnectionTestMockPDO'); $pdo->expects($this->any())->method('prepare')->will($this->returnValue($stmt)); @@ -309,7 +309,7 @@ public function testAlternateFetchModes() $connection->select('SELECT * FROM foo'); $connection->setFetchMode(PDO::FETCH_COLUMN, 3); $connection->select('SELECT * FROM foo'); - $connection->setFetchMode(PDO::FETCH_CLASS, 'stdClass', [1, 2, 3]); + $connection->setFetchMode(PDO::FETCH_CLASS, 'ClassName', [1, 2, 3]); $connection->select('SELECT * FROM foo'); }