1
0
mirror of synced 2025-02-07 15:59:27 +03:00

Added support for NEW operator when using ArrayHydration if user desires to benefit from this funcionality.

This commit is contained in:
Guilherme Blanco 2014-04-23 05:10:23 +00:00
parent 63d21ca4b2
commit 29de3e00ff
2 changed files with 48 additions and 3 deletions

View File

@ -121,6 +121,17 @@ class ArrayHydrator extends AbstractHydrator
} }
} }
// Extract "new" object constructor arguments. They're appended at the end.
if (isset($rowData['newObjects'])) {
$newObjects = $rowData['newObjects'];
unset($rowData['newObjects']);
if (empty($rowData)) {
++$this->_resultCounter;
}
}
// 2) Now hydrate the data found in the current row. // 2) Now hydrate the data found in the current row.
foreach ($rowData as $dqlAlias => $data) { foreach ($rowData as $dqlAlias => $data) {
$index = false; $index = false;
@ -262,6 +273,29 @@ class ArrayHydrator extends AbstractHydrator
$result[$resultKey][$name] = $value; $result[$resultKey][$name] = $value;
} }
} }
// Append new object to mixed result sets
if (isset($newObjects)) {
if ( ! isset($resultKey) ) {
$resultKey = $this->_resultCounter - 1;
}
$count = count($newObjects);
foreach ($newObjects as $objIndex => $newObject) {
$class = $newObject['class'];
$args = $newObject['args'];
$obj = $class->newInstanceArgs($args);
if ($count === 1) {
$result[$resultKey] = $obj;
continue;
}
$result[$resultKey][$objIndex] = $obj;
}
}
} }
/** /**

View File

@ -2,6 +2,7 @@
namespace Doctrine\Tests\ORM\Functional; namespace Doctrine\Tests\ORM\Functional;
use Doctrine\ORM\Query;
use Doctrine\Tests\Models\CMS\CmsUser; use Doctrine\Tests\Models\CMS\CmsUser;
use Doctrine\Tests\Models\CMS\CmsEmail; use Doctrine\Tests\Models\CMS\CmsEmail;
use Doctrine\Tests\Models\CMS\CmsAddress; use Doctrine\Tests\Models\CMS\CmsAddress;
@ -12,7 +13,6 @@ use Doctrine\Tests\Models\CMS\CmsPhonenumber;
*/ */
class NewOperatorTest extends \Doctrine\Tests\OrmFunctionalTestCase class NewOperatorTest extends \Doctrine\Tests\OrmFunctionalTestCase
{ {
/** /**
* @var array * @var array
*/ */
@ -26,6 +26,14 @@ class NewOperatorTest extends \Doctrine\Tests\OrmFunctionalTestCase
$this->loadFixtures(); $this->loadFixtures();
} }
public function provideDataForHydrationMode()
{
return array(
array(Query::HYDRATE_ARRAY),
array(Query::HYDRATE_OBJECT),
);
}
private function loadFixtures() private function loadFixtures()
{ {
$u1 = new CmsUser; $u1 = new CmsUser;
@ -87,7 +95,10 @@ class NewOperatorTest extends \Doctrine\Tests\OrmFunctionalTestCase
$this->fixtures = array($u1, $u2, $u3); $this->fixtures = array($u1, $u2, $u3);
} }
public function testShouldSupportsBasicUsage() /**
* @dataProvider provideDataForHydrationMode
*/
public function testShouldSupportsBasicUsage($hydrationMode)
{ {
$dql = " $dql = "
SELECT SELECT
@ -106,7 +117,7 @@ class NewOperatorTest extends \Doctrine\Tests\OrmFunctionalTestCase
u.name"; u.name";
$query = $this->_em->createQuery($dql); $query = $this->_em->createQuery($dql);
$result = $query->getResult(); $result = $query->getResult($hydrationMode);
$this->assertCount(3, $result); $this->assertCount(3, $result);