3 namespace Doctrine\Tests\ORM\Hydration;
5 use Doctrine\Tests\Mocks\HydratorMockStatement;
6 use Doctrine\ORM\Query\ResultSetMapping;
7 use Doctrine\ORM\Proxy\ProxyFactory;
8 use Doctrine\ORM\Mapping\AssociationMapping;
9 use Doctrine\ORM\Mapping\ClassMetadata;
10 use Doctrine\ORM\Query;
12 use Doctrine\Tests\Models\CMS\CmsUser;
14 require_once __DIR__ . '/../../TestInit.php';
16 class ObjectHydratorTest extends HydrationTestCase
18 public function provideDataForUserEntityResult()
26 public function provideDataForMultipleRootEntityResult()
32 array('user', 'article'),
36 public function provideDataForProductEntityResult()
45 * SELECT PARTIAL u.{id,name}
46 * FROM Doctrine\Tests\Models\CMS\CmsUser u
48 public function testSimpleEntityQuery()
50 $rsm = new ResultSetMapping;
51 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u');
52 $rsm->addFieldResult('u', 'u__id', 'id');
53 $rsm->addFieldResult('u', 'u__name', 'name');
67 $stmt = new HydratorMockStatement($resultSet);
68 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
69 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
71 $this->assertEquals(2, count($result));
73 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[0]);
74 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[1]);
76 $this->assertEquals(1, $result[0]->id);
77 $this->assertEquals('romanb', $result[0]->name);
79 $this->assertEquals(2, $result[1]->id);
80 $this->assertEquals('jwage', $result[1]->name);
84 * SELECT PARTIAL u.{id,name} AS user
85 * FROM Doctrine\Tests\Models\CMS\CmsUser u
87 public function testSimpleEntityQueryWithAliasedUserEntity()
89 $rsm = new ResultSetMapping;
90 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', 'user');
91 $rsm->addFieldResult('u', 'u__id', 'id');
92 $rsm->addFieldResult('u', 'u__name', 'name');
106 $stmt = new HydratorMockStatement($resultSet);
107 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
108 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
110 $this->assertEquals(2, count($result));
112 $this->assertArrayHasKey('user', $result[0]);
113 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[0]['user']);
115 $this->assertArrayHasKey('user', $result[1]);
116 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[1]['user']);
118 $this->assertEquals(1, $result[0]['user']->id);
119 $this->assertEquals('romanb', $result[0]['user']->name);
121 $this->assertEquals(2, $result[1]['user']->id);
122 $this->assertEquals('jwage', $result[1]['user']->name);
126 * SELECT PARTIAL u.{id, name}, PARTIAL a.{id, topic}
127 * FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsArticle a
129 public function testSimpleMultipleRootEntityQuery()
131 $rsm = new ResultSetMapping;
132 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u');
133 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsArticle', 'a');
134 $rsm->addFieldResult('u', 'u__id', 'id');
135 $rsm->addFieldResult('u', 'u__name', 'name');
136 $rsm->addFieldResult('a', 'a__id', 'id');
137 $rsm->addFieldResult('a', 'a__topic', 'topic');
143 'u__name' => 'romanb',
145 'a__topic' => 'Cool things.'
149 'u__name' => 'jwage',
151 'a__topic' => 'Cool things II.'
155 $stmt = new HydratorMockStatement($resultSet);
156 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
157 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
159 $this->assertEquals(4, count($result));
161 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[0]);
162 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsArticle', $result[1]);
163 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[2]);
164 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsArticle', $result[3]);
166 $this->assertEquals(1, $result[0]->id);
167 $this->assertEquals('romanb', $result[0]->name);
169 $this->assertEquals(1, $result[1]->id);
170 $this->assertEquals('Cool things.', $result[1]->topic);
172 $this->assertEquals(2, $result[2]->id);
173 $this->assertEquals('jwage', $result[2]->name);
175 $this->assertEquals(2, $result[3]->id);
176 $this->assertEquals('Cool things II.', $result[3]->topic);
180 * SELECT PARTIAL u.{id, name} AS user, PARTIAL a.{id, topic}
181 * FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsArticle a
183 public function testSimpleMultipleRootEntityQueryWithAliasedUserEntity()
185 $rsm = new ResultSetMapping;
186 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', 'user');
187 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsArticle', 'a');
188 $rsm->addFieldResult('u', 'u__id', 'id');
189 $rsm->addFieldResult('u', 'u__name', 'name');
190 $rsm->addFieldResult('a', 'a__id', 'id');
191 $rsm->addFieldResult('a', 'a__topic', 'topic');
197 'u__name' => 'romanb',
199 'a__topic' => 'Cool things.'
203 'u__name' => 'jwage',
205 'a__topic' => 'Cool things II.'
209 $stmt = new HydratorMockStatement($resultSet);
210 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
211 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
213 $this->assertEquals(4, count($result));
215 $this->assertArrayHasKey('user', $result[0]);
216 $this->assertArrayNotHasKey(0, $result[0]);
217 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[0]['user']);
218 $this->assertEquals(1, $result[0]['user']->id);
219 $this->assertEquals('romanb', $result[0]['user']->name);
221 $this->assertArrayHasKey(0, $result[1]);
222 $this->assertArrayNotHasKey('user', $result[1]);
223 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsArticle', $result[1][0]);
224 $this->assertEquals(1, $result[1][0]->id);
225 $this->assertEquals('Cool things.', $result[1][0]->topic);
227 $this->assertArrayHasKey('user', $result[2]);
228 $this->assertArrayNotHasKey(0, $result[2]);
229 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[2]['user']);
230 $this->assertEquals(2, $result[2]['user']->id);
231 $this->assertEquals('jwage', $result[2]['user']->name);
233 $this->assertArrayHasKey(0, $result[3]);
234 $this->assertArrayNotHasKey('user', $result[3]);
235 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsArticle', $result[3][0]);
236 $this->assertEquals(2, $result[3][0]->id);
237 $this->assertEquals('Cool things II.', $result[3][0]->topic);
241 * SELECT PARTIAL u.{id, name}, PARTIAL a.{id, topic} AS article
242 * FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsArticle a
244 public function testSimpleMultipleRootEntityQueryWithAliasedArticleEntity()
246 $rsm = new ResultSetMapping;
247 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u');
248 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsArticle', 'a', 'article');
249 $rsm->addFieldResult('u', 'u__id', 'id');
250 $rsm->addFieldResult('u', 'u__name', 'name');
251 $rsm->addFieldResult('a', 'a__id', 'id');
252 $rsm->addFieldResult('a', 'a__topic', 'topic');
258 'u__name' => 'romanb',
260 'a__topic' => 'Cool things.'
264 'u__name' => 'jwage',
266 'a__topic' => 'Cool things II.'
270 $stmt = new HydratorMockStatement($resultSet);
271 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
272 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
274 $this->assertEquals(4, count($result));
276 $this->assertArrayHasKey(0, $result[0]);
277 $this->assertArrayNotHasKey('article', $result[0]);
278 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[0][0]);
279 $this->assertEquals(1, $result[0][0]->id);
280 $this->assertEquals('romanb', $result[0][0]->name);
282 $this->assertArrayHasKey('article', $result[1]);
283 $this->assertArrayNotHasKey(0, $result[1]);
284 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsArticle', $result[1]['article']);
285 $this->assertEquals(1, $result[1]['article']->id);
286 $this->assertEquals('Cool things.', $result[1]['article']->topic);
288 $this->assertArrayHasKey(0, $result[2]);
289 $this->assertArrayNotHasKey('article', $result[2]);
290 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[2][0]);
291 $this->assertEquals(2, $result[2][0]->id);
292 $this->assertEquals('jwage', $result[2][0]->name);
294 $this->assertArrayHasKey('article', $result[3]);
295 $this->assertArrayNotHasKey(0, $result[3]);
296 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsArticle', $result[3]['article']);
297 $this->assertEquals(2, $result[3]['article']->id);
298 $this->assertEquals('Cool things II.', $result[3]['article']->topic);
302 * SELECT PARTIAL u.{id, name} AS user, PARTIAL a.{id, topic} AS article
303 * FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsArticle a
305 public function testSimpleMultipleRootEntityQueryWithAliasedEntities()
307 $rsm = new ResultSetMapping;
308 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', 'user');
309 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsArticle', 'a', 'article');
310 $rsm->addFieldResult('u', 'u__id', 'id');
311 $rsm->addFieldResult('u', 'u__name', 'name');
312 $rsm->addFieldResult('a', 'a__id', 'id');
313 $rsm->addFieldResult('a', 'a__topic', 'topic');
319 'u__name' => 'romanb',
321 'a__topic' => 'Cool things.'
325 'u__name' => 'jwage',
327 'a__topic' => 'Cool things II.'
331 $stmt = new HydratorMockStatement($resultSet);
332 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
333 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
335 $this->assertEquals(4, count($result));
337 $this->assertArrayHasKey('user', $result[0]);
338 $this->assertArrayNotHasKey('article', $result[0]);
339 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[0]['user']);
340 $this->assertEquals(1, $result[0]['user']->id);
341 $this->assertEquals('romanb', $result[0]['user']->name);
343 $this->assertArrayHasKey('article', $result[1]);
344 $this->assertArrayNotHasKey('user', $result[1]);
345 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsArticle', $result[1]['article']);
346 $this->assertEquals(1, $result[1]['article']->id);
347 $this->assertEquals('Cool things.', $result[1]['article']->topic);
349 $this->assertArrayHasKey('user', $result[2]);
350 $this->assertArrayNotHasKey('article', $result[2]);
351 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[2]['user']);
352 $this->assertEquals(2, $result[2]['user']->id);
353 $this->assertEquals('jwage', $result[2]['user']->name);
355 $this->assertArrayHasKey('article', $result[3]);
356 $this->assertArrayNotHasKey('user', $result[3]);
357 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsArticle', $result[3]['article']);
358 $this->assertEquals(2, $result[3]['article']->id);
359 $this->assertEquals('Cool things II.', $result[3]['article']->topic);
363 * SELECT PARTIAL u.{id, status}, COUNT(p.phonenumber) numPhones
365 * JOIN u.phonenumbers p
368 * @dataProvider provideDataForUserEntityResult
370 public function testMixedQueryNormalJoin($userEntityKey)
372 $rsm = new ResultSetMapping;
373 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $userEntityKey ?: null);
374 $rsm->addFieldResult('u', 'u__id', 'id');
375 $rsm->addFieldResult('u', 'u__status', 'status');
376 $rsm->addScalarResult('sclr0', 'numPhones');
383 'u__status' => 'developer',
388 'u__status' => 'developer',
393 $stmt = new HydratorMockStatement($resultSet);
394 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
395 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
397 $this->assertEquals(2, count($result));
399 $this->assertInternalType('array', $result);
400 $this->assertInternalType('array', $result[0]);
401 $this->assertInternalType('array', $result[1]);
403 // first user => 2 phonenumbers
404 $this->assertEquals(2, $result[0]['numPhones']);
405 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[0][$userEntityKey]);
407 // second user => 1 phonenumber
408 $this->assertEquals(1, $result[1]['numPhones']);
409 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[1][$userEntityKey]);
413 * SELECT PARTIAL u.{id, status}, PARTIAL p.{phonenumber}, UPPER(u.name) nameUpper
414 * FROM Doctrine\Tests\Models\CMS\CmsUser u
415 * JOIN u.phonenumbers p
417 * @dataProvider provideDataForUserEntityResult
419 public function testMixedQueryFetchJoin($userEntityKey)
421 $rsm = new ResultSetMapping;
422 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $userEntityKey ?: null);
423 $rsm->addJoinedEntityResult(
424 'Doctrine\Tests\Models\CMS\CmsPhonenumber',
429 $rsm->addFieldResult('u', 'u__id', 'id');
430 $rsm->addFieldResult('u', 'u__status', 'status');
431 $rsm->addFieldResult('p', 'p__phonenumber', 'phonenumber');
432 $rsm->addScalarResult('sclr0', 'nameUpper');
439 'u__status' => 'developer',
440 'p__phonenumber' => '42',
445 'u__status' => 'developer',
446 'p__phonenumber' => '43',
451 'u__status' => 'developer',
452 'p__phonenumber' => '91',
457 $stmt = new HydratorMockStatement($resultSet);
458 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
459 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
461 $this->assertEquals(2, count($result));
463 $this->assertInternalType('array', $result);
464 $this->assertInternalType('array', $result[0]);
465 $this->assertInternalType('array', $result[1]);
467 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[0][$userEntityKey]);
468 $this->assertInstanceOf('Doctrine\ORM\PersistentCollection', $result[0][$userEntityKey]->phonenumbers);
469 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsPhonenumber', $result[0][$userEntityKey]->phonenumbers[0]);
471 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[1][$userEntityKey]);
472 $this->assertInstanceOf('Doctrine\ORM\PersistentCollection', $result[1][$userEntityKey]->phonenumbers);
473 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsPhonenumber', $result[0][$userEntityKey]->phonenumbers[1]);
475 // first user => 2 phonenumbers
476 $this->assertEquals(2, count($result[0][$userEntityKey]->phonenumbers));
477 $this->assertEquals('ROMANB', $result[0]['nameUpper']);
479 // second user => 1 phonenumber
480 $this->assertEquals(1, count($result[1][$userEntityKey]->phonenumbers));
481 $this->assertEquals('JWAGE', $result[1]['nameUpper']);
483 $this->assertEquals(42, $result[0][$userEntityKey]->phonenumbers[0]->phonenumber);
484 $this->assertEquals(43, $result[0][$userEntityKey]->phonenumbers[1]->phonenumber);
485 $this->assertEquals(91, $result[1][$userEntityKey]->phonenumbers[0]->phonenumber);
489 * SELECT u, p, UPPER(u.name) nameUpper
492 * JOIN u.phonenumbers p
493 * INDEX BY p.phonenumber
495 * @dataProvider provideDataForUserEntityResult
497 public function testMixedQueryFetchJoinCustomIndex($userEntityKey)
499 $rsm = new ResultSetMapping;
500 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $userEntityKey ?: null);
501 $rsm->addJoinedEntityResult(
502 'Doctrine\Tests\Models\CMS\CmsPhonenumber',
507 $rsm->addFieldResult('u', 'u__id', 'id');
508 $rsm->addFieldResult('u', 'u__status', 'status');
509 $rsm->addScalarResult('sclr0', 'nameUpper');
510 $rsm->addFieldResult('p', 'p__phonenumber', 'phonenumber');
511 $rsm->addIndexBy('u', 'id');
512 $rsm->addIndexBy('p', 'phonenumber');
519 'u__status' => 'developer',
521 'p__phonenumber' => '42',
525 'u__status' => 'developer',
527 'p__phonenumber' => '43',
531 'u__status' => 'developer',
533 'p__phonenumber' => '91'
538 $stmt = new HydratorMockStatement($resultSet);
539 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
540 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
542 $this->assertEquals(2, count($result));
544 $this->assertInternalType('array', $result);
545 $this->assertInternalType('array', $result[1]);
546 $this->assertInternalType('array', $result[2]);
548 // test the scalar values
549 $this->assertEquals('ROMANB', $result[1]['nameUpper']);
550 $this->assertEquals('JWAGE', $result[2]['nameUpper']);
552 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[1][$userEntityKey]);
553 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[2][$userEntityKey]);
554 $this->assertInstanceOf('Doctrine\ORM\PersistentCollection', $result[1][$userEntityKey]->phonenumbers);
556 // first user => 2 phonenumbers. notice the custom indexing by user id
557 $this->assertEquals(2, count($result[1][$userEntityKey]->phonenumbers));
559 // second user => 1 phonenumber. notice the custom indexing by user id
560 $this->assertEquals(1, count($result[2][$userEntityKey]->phonenumbers));
562 // test the custom indexing of the phonenumbers
563 $this->assertTrue(isset($result[1][$userEntityKey]->phonenumbers['42']));
564 $this->assertTrue(isset($result[1][$userEntityKey]->phonenumbers['43']));
565 $this->assertTrue(isset($result[2][$userEntityKey]->phonenumbers['91']));
569 * SELECT u, p, UPPER(u.name) nameUpper, a
571 * JOIN u.phonenumbers p
574 * @dataProvider provideDataForUserEntityResult
576 public function testMixedQueryMultipleFetchJoin($userEntityKey)
578 $rsm = new ResultSetMapping;
579 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $userEntityKey ?: null);
580 $rsm->addJoinedEntityResult(
581 'Doctrine\Tests\Models\CMS\CmsPhonenumber',
586 $rsm->addJoinedEntityResult(
587 'Doctrine\Tests\Models\CMS\CmsArticle',
592 $rsm->addFieldResult('u', 'u__id', 'id');
593 $rsm->addFieldResult('u', 'u__status', 'status');
594 $rsm->addScalarResult('sclr0', 'nameUpper');
595 $rsm->addFieldResult('p', 'p__phonenumber', 'phonenumber');
596 $rsm->addFieldResult('a', 'a__id', 'id');
597 $rsm->addFieldResult('a', 'a__topic', 'topic');
604 'u__status' => 'developer',
606 'p__phonenumber' => '42',
608 'a__topic' => 'Getting things done!'
612 'u__status' => 'developer',
614 'p__phonenumber' => '43',
616 'a__topic' => 'Getting things done!'
620 'u__status' => 'developer',
622 'p__phonenumber' => '42',
624 'a__topic' => 'ZendCon'
628 'u__status' => 'developer',
630 'p__phonenumber' => '43',
632 'a__topic' => 'ZendCon'
636 'u__status' => 'developer',
638 'p__phonenumber' => '91',
644 'u__status' => 'developer',
646 'p__phonenumber' => '91',
652 $stmt = new HydratorMockStatement($resultSet);
653 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
654 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
656 $this->assertEquals(2, count($result));
658 $this->assertTrue(is_array($result));
659 $this->assertTrue(is_array($result[0]));
660 $this->assertTrue(is_array($result[1]));
662 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[0][$userEntityKey]);
663 $this->assertInstanceOf('Doctrine\ORM\PersistentCollection', $result[0][$userEntityKey]->phonenumbers);
664 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsPhonenumber', $result[0][$userEntityKey]->phonenumbers[0]);
665 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsPhonenumber', $result[0][$userEntityKey]->phonenumbers[1]);
666 $this->assertInstanceOf('Doctrine\ORM\PersistentCollection', $result[0][$userEntityKey]->articles);
667 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsArticle', $result[0][$userEntityKey]->articles[0]);
668 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsArticle', $result[0][$userEntityKey]->articles[1]);
670 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[1][$userEntityKey]);
671 $this->assertInstanceOf('Doctrine\ORM\PersistentCollection', $result[1][$userEntityKey]->phonenumbers);
672 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsPhonenumber', $result[1][$userEntityKey]->phonenumbers[0]);
673 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsArticle', $result[1][$userEntityKey]->articles[0]);
674 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsArticle', $result[1][$userEntityKey]->articles[1]);
678 * SELECT u, p, UPPER(u.name) nameUpper, a, c
680 * JOIN u.phonenumbers p
682 * LEFT JOIN a.comments c
684 * @dataProvider provideDataForUserEntityResult
686 public function testMixedQueryMultipleDeepMixedFetchJoin($userEntityKey)
688 $rsm = new ResultSetMapping;
689 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $userEntityKey ?: null);
690 $rsm->addJoinedEntityResult(
691 'Doctrine\Tests\Models\CMS\CmsPhonenumber',
696 $rsm->addJoinedEntityResult(
697 'Doctrine\Tests\Models\CMS\CmsArticle',
702 $rsm->addJoinedEntityResult(
703 'Doctrine\Tests\Models\CMS\CmsComment',
708 $rsm->addFieldResult('u', 'u__id', 'id');
709 $rsm->addFieldResult('u', 'u__status', 'status');
710 $rsm->addScalarResult('sclr0', 'nameUpper');
711 $rsm->addFieldResult('p', 'p__phonenumber', 'phonenumber');
712 $rsm->addFieldResult('a', 'a__id', 'id');
713 $rsm->addFieldResult('a', 'a__topic', 'topic');
714 $rsm->addFieldResult('c', 'c__id', 'id');
715 $rsm->addFieldResult('c', 'c__topic', 'topic');
722 'u__status' => 'developer',
724 'p__phonenumber' => '42',
726 'a__topic' => 'Getting things done!',
728 'c__topic' => 'First!'
732 'u__status' => 'developer',
734 'p__phonenumber' => '43',
736 'a__topic' => 'Getting things done!',
738 'c__topic' => 'First!'
742 'u__status' => 'developer',
744 'p__phonenumber' => '42',
746 'a__topic' => 'ZendCon',
752 'u__status' => 'developer',
754 'p__phonenumber' => '43',
756 'a__topic' => 'ZendCon',
762 'u__status' => 'developer',
764 'p__phonenumber' => '91',
766 'a__topic' => 'LINQ',
772 'u__status' => 'developer',
774 'p__phonenumber' => '91',
776 'a__topic' => 'PHP6',
782 $stmt = new HydratorMockStatement($resultSet);
783 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
784 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
786 $this->assertEquals(2, count($result));
788 $this->assertTrue(is_array($result));
789 $this->assertTrue(is_array($result[0]));
790 $this->assertTrue(is_array($result[1]));
792 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[0][$userEntityKey]);
793 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[1][$userEntityKey]);
796 $this->assertInstanceOf('Doctrine\ORM\PersistentCollection', $result[0][$userEntityKey]->phonenumbers);
797 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsPhonenumber', $result[0][$userEntityKey]->phonenumbers[0]);
798 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsPhonenumber', $result[0][$userEntityKey]->phonenumbers[1]);
800 $this->assertInstanceOf('Doctrine\ORM\PersistentCollection', $result[1][$userEntityKey]->phonenumbers);
801 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsPhonenumber', $result[1][$userEntityKey]->phonenumbers[0]);
804 $this->assertInstanceOf('Doctrine\ORM\PersistentCollection', $result[0][$userEntityKey]->articles);
805 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsArticle', $result[0][$userEntityKey]->articles[0]);
806 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsArticle', $result[0][$userEntityKey]->articles[1]);
808 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsArticle', $result[1][$userEntityKey]->articles[0]);
809 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsArticle', $result[1][$userEntityKey]->articles[1]);
812 $this->assertInstanceOf('Doctrine\ORM\PersistentCollection', $result[0][$userEntityKey]->articles[0]->comments);
813 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsComment', $result[0][$userEntityKey]->articles[0]->comments[0]);
815 // empty comment collections
816 $this->assertInstanceOf('Doctrine\ORM\PersistentCollection', $result[0][$userEntityKey]->articles[1]->comments);
817 $this->assertEquals(0, count($result[0][$userEntityKey]->articles[1]->comments));
819 $this->assertInstanceOf('Doctrine\ORM\PersistentCollection', $result[1][$userEntityKey]->articles[0]->comments);
820 $this->assertEquals(0, count($result[1][$userEntityKey]->articles[0]->comments));
821 $this->assertInstanceOf('Doctrine\ORM\PersistentCollection', $result[1][$userEntityKey]->articles[1]->comments);
822 $this->assertEquals(0, count($result[1][$userEntityKey]->articles[1]->comments));
826 * Tests that the hydrator does not rely on a particular order of the rows
830 * select c, b from Doctrine\Tests\Models\Forum\ForumCategory c inner join c.boards b
831 * order by c.position asc, b.position asc
833 * Checks whether the boards are correctly assigned to the categories.
835 * The 'evil' result set that confuses the object population is displayed below.
837 * c.id | c.position | c.name | boardPos | b.id | b.category_id (just for clarity)
838 * 1 | 0 | First | 0 | 1 | 1
839 * 2 | 0 | Second | 0 | 2 | 2 <--
840 * 1 | 0 | First | 1 | 3 | 1
841 * 1 | 0 | First | 2 | 4 | 1
843 public function testEntityQueryCustomResultSetOrder()
845 $rsm = new ResultSetMapping;
846 $rsm->addEntityResult('Doctrine\Tests\Models\Forum\ForumCategory', 'c');
847 $rsm->addJoinedEntityResult(
848 'Doctrine\Tests\Models\Forum\ForumBoard',
853 $rsm->addFieldResult('c', 'c__id', 'id');
854 $rsm->addFieldResult('c', 'c__position', 'position');
855 $rsm->addFieldResult('c', 'c__name', 'name');
856 $rsm->addFieldResult('b', 'b__id', 'id');
857 $rsm->addFieldResult('b', 'b__position', 'position');
863 'c__position' => '0',
864 'c__name' => 'First',
866 'b__position' => '0',
867 //'b__category_id' => '1'
871 'c__position' => '0',
872 'c__name' => 'Second',
874 'b__position' => '0',
875 //'b__category_id' => '2'
879 'c__position' => '0',
880 'c__name' => 'First',
882 'b__position' => '1',
883 //'b__category_id' => '1'
887 'c__position' => '0',
888 'c__name' => 'First',
890 'b__position' => '2',
891 //'b__category_id' => '1'
895 $stmt = new HydratorMockStatement($resultSet);
896 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
897 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
899 $this->assertEquals(2, count($result));
901 $this->assertInstanceOf('Doctrine\Tests\Models\Forum\ForumCategory', $result[0]);
902 $this->assertInstanceOf('Doctrine\Tests\Models\Forum\ForumCategory', $result[1]);
904 $this->assertTrue($result[0] !== $result[1]);
906 $this->assertEquals(1, $result[0]->getId());
907 $this->assertEquals(2, $result[1]->getId());
909 $this->assertTrue(isset($result[0]->boards));
910 $this->assertEquals(3, count($result[0]->boards));
912 $this->assertTrue(isset($result[1]->boards));
913 $this->assertEquals(1, count($result[1]->boards));
917 * SELECT PARTIAL u.{id,name}
918 * FROM Doctrine\Tests\Models\CMS\CmsUser u
922 public function testSkipUnknownColumns()
924 $rsm = new ResultSetMapping;
925 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u');
926 $rsm->addFieldResult('u', 'u__id', 'id');
927 $rsm->addFieldResult('u', 'u__name', 'name');
933 'u__name' => 'romanb',
934 'foo' => 'bar', // unknown!
938 $stmt = new HydratorMockStatement($resultSet);
939 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
940 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
942 $this->assertEquals(1, count($result));
943 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[0]);
947 * SELECT u.id, u.name
948 * FROM Doctrine\Tests\Models\CMS\CmsUser u
950 * @dataProvider provideDataForUserEntityResult
952 public function testScalarQueryWithoutResultVariables($userEntityKey)
954 $rsm = new ResultSetMapping;
955 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $userEntityKey ?: null);
956 $rsm->addScalarResult('sclr0', 'id');
957 $rsm->addScalarResult('sclr1', 'name');
971 $stmt = new HydratorMockStatement($resultSet);
972 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
973 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
975 $this->assertEquals(2, count($result));
977 $this->assertInternalType('array', $result[0]);
978 $this->assertInternalType('array', $result[1]);
980 $this->assertEquals(1, $result[0]['id']);
981 $this->assertEquals('romanb', $result[0]['name']);
983 $this->assertEquals(2, $result[1]['id']);
984 $this->assertEquals('jwage', $result[1]['name']);
989 * FROM Doctrine\Tests\Models\ECommerce\ECommerceProduct p
991 public function testCreatesProxyForLazyLoadingWithForeignKeys()
993 $rsm = new ResultSetMapping;
994 $rsm->addEntityResult('Doctrine\Tests\Models\ECommerce\ECommerceProduct', 'p');
995 $rsm->addFieldResult('p', 'p__id', 'id');
996 $rsm->addFieldResult('p', 'p__name', 'name');
997 $rsm->addMetaResult('p', 'p__shipping_id', 'shipping_id');
1003 'p__name' => 'Doctrine Book',
1004 'p__shipping_id' => 42
1008 $proxyInstance = new \Doctrine\Tests\Models\ECommerce\ECommerceShipping();
1010 // mocking the proxy factory
1011 $proxyFactory = $this->getMock('Doctrine\ORM\Proxy\ProxyFactory', array('getProxy'), array(), '', false, false, false);
1012 $proxyFactory->expects($this->once())
1013 ->method('getProxy')
1014 ->with($this->equalTo('Doctrine\Tests\Models\ECommerce\ECommerceShipping'), array('id' => 42))
1015 ->will($this->returnValue($proxyInstance));
1017 $this->_em->setProxyFactory($proxyFactory);
1019 // configuring lazy loading
1020 $metadata = $this->_em->getClassMetadata('Doctrine\Tests\Models\ECommerce\ECommerceProduct');
1021 $metadata->associationMappings['shipping']['fetch'] = ClassMetadata::FETCH_LAZY;
1023 $stmt = new HydratorMockStatement($resultSet);
1024 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
1025 $result = $hydrator->hydrateAll($stmt, $rsm);
1027 $this->assertEquals(1, count($result));
1029 $this->assertInstanceOf('Doctrine\Tests\Models\ECommerce\ECommerceProduct', $result[0]);
1033 * SELECT p AS product
1034 * FROM Doctrine\Tests\Models\ECommerce\ECommerceProduct p
1036 public function testCreatesProxyForLazyLoadingWithForeignKeysWithAliasedProductEntity()
1038 $rsm = new ResultSetMapping;
1039 $rsm->addEntityResult('Doctrine\Tests\Models\ECommerce\ECommerceProduct', 'p', 'product');
1040 $rsm->addFieldResult('p', 'p__id', 'id');
1041 $rsm->addFieldResult('p', 'p__name', 'name');
1042 $rsm->addMetaResult('p', 'p__shipping_id', 'shipping_id');
1048 'p__name' => 'Doctrine Book',
1049 'p__shipping_id' => 42
1053 $proxyInstance = new \Doctrine\Tests\Models\ECommerce\ECommerceShipping();
1055 // mocking the proxy factory
1056 $proxyFactory = $this->getMock('Doctrine\ORM\Proxy\ProxyFactory', array('getProxy'), array(), '', false, false, false);
1057 $proxyFactory->expects($this->once())
1058 ->method('getProxy')
1059 ->with($this->equalTo('Doctrine\Tests\Models\ECommerce\ECommerceShipping'), array('id' => 42))
1060 ->will($this->returnValue($proxyInstance));
1062 $this->_em->setProxyFactory($proxyFactory);
1064 // configuring lazy loading
1065 $metadata = $this->_em->getClassMetadata('Doctrine\Tests\Models\ECommerce\ECommerceProduct');
1066 $metadata->associationMappings['shipping']['fetch'] = ClassMetadata::FETCH_LAZY;
1068 $stmt = new HydratorMockStatement($resultSet);
1069 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
1070 $result = $hydrator->hydrateAll($stmt, $rsm);
1072 $this->assertEquals(1, count($result));
1074 $this->assertInternalType('array', $result[0]);
1075 $this->assertInstanceOf('Doctrine\Tests\Models\ECommerce\ECommerceProduct', $result[0]['product']);
1079 * SELECT PARTIAL u.{id, status}, PARTIAL a.{id, topic}, PARTIAL c.{id, topic}
1080 * FROM Doctrine\Tests\Models\CMS\CmsUser u
1081 * LEFT JOIN u.articles a
1082 * LEFT JOIN a.comments c
1084 public function testChainedJoinWithEmptyCollections()
1086 $rsm = new ResultSetMapping;
1087 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u');
1088 $rsm->addJoinedEntityResult(
1089 'Doctrine\Tests\Models\CMS\CmsArticle',
1094 $rsm->addJoinedEntityResult(
1095 'Doctrine\Tests\Models\CMS\CmsComment',
1100 $rsm->addFieldResult('u', 'u__id', 'id');
1101 $rsm->addFieldResult('u', 'u__status', 'status');
1102 $rsm->addFieldResult('a', 'a__id', 'id');
1103 $rsm->addFieldResult('a', 'a__topic', 'topic');
1104 $rsm->addFieldResult('c', 'c__id', 'id');
1105 $rsm->addFieldResult('c', 'c__topic', 'topic');
1112 'u__status' => 'developer',
1120 'u__status' => 'developer',
1128 $stmt = new HydratorMockStatement($resultSet);
1129 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
1130 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
1132 $this->assertEquals(2, count($result));
1134 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[0]);
1135 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[1]);
1137 $this->assertEquals(0, $result[0]->articles->count());
1138 $this->assertEquals(0, $result[1]->articles->count());
1142 * SELECT PARTIAL u.{id, status} AS user, PARTIAL a.{id, topic}, PARTIAL c.{id, topic}
1143 * FROM Doctrine\Tests\Models\CMS\CmsUser u
1144 * LEFT JOIN u.articles a
1145 * LEFT JOIN a.comments c
1147 public function testChainedJoinWithEmptyCollectionsWithAliasedUserEntity()
1149 $rsm = new ResultSetMapping;
1150 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', 'user');
1151 $rsm->addJoinedEntityResult(
1152 'Doctrine\Tests\Models\CMS\CmsArticle',
1157 $rsm->addJoinedEntityResult(
1158 'Doctrine\Tests\Models\CMS\CmsComment',
1163 $rsm->addFieldResult('u', 'u__id', 'id');
1164 $rsm->addFieldResult('u', 'u__status', 'status');
1165 $rsm->addFieldResult('a', 'a__id', 'id');
1166 $rsm->addFieldResult('a', 'a__topic', 'topic');
1167 $rsm->addFieldResult('c', 'c__id', 'id');
1168 $rsm->addFieldResult('c', 'c__topic', 'topic');
1175 'u__status' => 'developer',
1183 'u__status' => 'developer',
1191 $stmt = new HydratorMockStatement($resultSet);
1192 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
1193 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
1195 $this->assertEquals(2, count($result));
1197 $this->assertInternalType('array', $result[0]);
1198 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[0]['user']);
1200 $this->assertInternalType('array', $result[1]);
1201 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[1]['user']);
1203 $this->assertEquals(0, $result[0]['user']->articles->count());
1204 $this->assertEquals(0, $result[1]['user']->articles->count());
1208 * SELECT PARTIAL u.{id,status}, a.id, a.topic, c.id as cid, c.topic as ctopic
1210 * LEFT JOIN u.articles a
1211 * LEFT JOIN a.comments c
1214 * @dataProvider provideDataForUserEntityResult
1216 /*public function testChainedJoinWithScalars($userEntityKey)
1218 $rsm = new ResultSetMapping;
1219 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $userEntityKey ?: null);
1220 $rsm->addFieldResult('u', 'u__id', 'id');
1221 $rsm->addFieldResult('u', 'u__status', 'status');
1222 $rsm->addScalarResult('a__id', 'id');
1223 $rsm->addScalarResult('a__topic', 'topic');
1224 $rsm->addScalarResult('c__id', 'cid');
1225 $rsm->addScalarResult('c__topic', 'ctopic');
1232 'u__status' => 'developer',
1234 'a__topic' => 'The First',
1236 'c__topic' => 'First Comment'
1240 'u__status' => 'developer',
1242 'a__topic' => 'The First',
1244 'c__topic' => 'Second Comment'
1248 'u__status' => 'developer',
1250 'a__topic' => 'The Answer',
1256 $stmt = new HydratorMockStatement($resultSet);
1257 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
1258 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
1260 \Doctrine\Common\Util\Debug::dump($result, 3);
1262 $this->assertEquals(1, count($result));
1264 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[0][$userEntityKey]); // User object
1265 $this->assertEquals(42, $result[0]['id']);
1266 $this->assertEquals('The First', $result[0]['topic']);
1267 $this->assertEquals(1, $result[0]['cid']);
1268 $this->assertEquals('First Comment', $result[0]['ctopic']);
1272 * SELECT PARTIAL u.{id, name}
1273 * FROM Doctrine\Tests\Models\CMS\CmsUser u
1275 public function testResultIteration()
1277 $rsm = new ResultSetMapping;
1278 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u');
1279 $rsm->addFieldResult('u', 'u__id', 'id');
1280 $rsm->addFieldResult('u', 'u__name', 'name');
1286 'u__name' => 'romanb'
1290 'u__name' => 'jwage'
1294 $stmt = new HydratorMockStatement($resultSet);
1295 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
1296 $iterableResult = $hydrator->iterate($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
1299 while (($row = $iterableResult->next()) !== false) {
1300 $this->assertEquals(1, count($row));
1301 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $row[0]);
1304 $this->assertEquals(1, $row[0]->id);
1305 $this->assertEquals('romanb', $row[0]->name);
1306 } else if ($rowNum == 1) {
1307 $this->assertEquals(2, $row[0]->id);
1308 $this->assertEquals('jwage', $row[0]->name);
1316 * SELECT PARTIAL u.{id, name}
1317 * FROM Doctrine\Tests\Models\CMS\CmsUser u
1319 public function testResultIterationWithAliasedUserEntity()
1321 $rsm = new ResultSetMapping;
1322 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', 'user');
1323 $rsm->addFieldResult('u', 'u__id', 'id');
1324 $rsm->addFieldResult('u', 'u__name', 'name');
1330 'u__name' => 'romanb'
1334 'u__name' => 'jwage'
1338 $stmt = new HydratorMockStatement($resultSet);
1339 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
1340 $iterableResult = $hydrator->iterate($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
1343 while (($row = $iterableResult->next()) !== false) {
1344 $this->assertEquals(1, count($row));
1345 $this->assertArrayHasKey(0, $row);
1346 $this->assertArrayHasKey('user', $row[0]);
1347 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $row[0]['user']);
1350 $this->assertEquals(1, $row[0]['user']->id);
1351 $this->assertEquals('romanb', $row[0]['user']->name);
1352 } else if ($rowNum == 1) {
1353 $this->assertEquals(2, $row[0]['user']->id);
1354 $this->assertEquals('jwage', $row[0]['user']->name);
1362 * Checks if multiple joined multiple-valued collections is hydrated correctly.
1364 * SELECT PARTIAL u.{id, status}, PARTIAL g.{id, name}, PARTIAL p.{phonenumber}
1365 * FROM Doctrine\Tests\Models\CMS\CmsUser u
1369 public function testManyToManyHydration()
1371 $rsm = new ResultSetMapping;
1372 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u');
1373 $rsm->addFieldResult('u', 'u__id', 'id');
1374 $rsm->addFieldResult('u', 'u__name', 'name');
1375 $rsm->addJoinedEntityResult('Doctrine\Tests\Models\CMS\CmsGroup', 'g', 'u', 'groups');
1376 $rsm->addFieldResult('g', 'g__id', 'id');
1377 $rsm->addFieldResult('g', 'g__name', 'name');
1378 $rsm->addJoinedEntityResult('Doctrine\Tests\Models\CMS\CmsPhonenumber', 'p', 'u', 'phonenumbers');
1379 $rsm->addFieldResult('p', 'p__phonenumber', 'phonenumber');
1385 'u__name' => 'romanb',
1387 'g__name' => 'TestGroupB',
1388 'p__phonenumber' => 1111,
1392 'u__name' => 'romanb',
1394 'g__name' => 'TestGroupD',
1395 'p__phonenumber' => 1111,
1399 'u__name' => 'romanb',
1401 'g__name' => 'TestGroupB',
1402 'p__phonenumber' => 2222,
1406 'u__name' => 'romanb',
1408 'g__name' => 'TestGroupD',
1409 'p__phonenumber' => 2222,
1413 'u__name' => 'jwage',
1415 'g__name' => 'TestGroupA',
1416 'p__phonenumber' => 3333,
1420 'u__name' => 'jwage',
1422 'g__name' => 'TestGroupB',
1423 'p__phonenumber' => 3333,
1427 'u__name' => 'jwage',
1429 'g__name' => 'TestGroupC',
1430 'p__phonenumber' => 3333,
1434 'u__name' => 'jwage',
1436 'g__name' => 'TestGroupD',
1437 'p__phonenumber' => 3333,
1441 'u__name' => 'jwage',
1443 'g__name' => 'TestGroupA',
1444 'p__phonenumber' => 4444,
1448 'u__name' => 'jwage',
1450 'g__name' => 'TestGroupB',
1451 'p__phonenumber' => 4444,
1455 'u__name' => 'jwage',
1457 'g__name' => 'TestGroupC',
1458 'p__phonenumber' => 4444,
1462 'u__name' => 'jwage',
1464 'g__name' => 'TestGroupD',
1465 'p__phonenumber' => 4444,
1469 $stmt = new HydratorMockStatement($resultSet);
1470 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
1471 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
1473 $this->assertEquals(2, count($result));
1475 $this->assertContainsOnly('Doctrine\Tests\Models\CMS\CmsUser', $result);
1477 $this->assertEquals(2, count($result[0]->groups));
1478 $this->assertEquals(2, count($result[0]->phonenumbers));
1480 $this->assertEquals(4, count($result[1]->groups));
1481 $this->assertEquals(2, count($result[1]->phonenumbers));
1485 * Checks if multiple joined multiple-valued collections is hydrated correctly.
1487 * SELECT PARTIAL u.{id, status} As user, PARTIAL g.{id, name}, PARTIAL p.{phonenumber}
1488 * FROM Doctrine\Tests\Models\CMS\CmsUser u
1492 public function testManyToManyHydrationWithAliasedUserEntity()
1494 $rsm = new ResultSetMapping;
1495 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', 'user');
1496 $rsm->addFieldResult('u', 'u__id', 'id');
1497 $rsm->addFieldResult('u', 'u__name', 'name');
1498 $rsm->addJoinedEntityResult('Doctrine\Tests\Models\CMS\CmsGroup', 'g', 'u', 'groups');
1499 $rsm->addFieldResult('g', 'g__id', 'id');
1500 $rsm->addFieldResult('g', 'g__name', 'name');
1501 $rsm->addJoinedEntityResult('Doctrine\Tests\Models\CMS\CmsPhonenumber', 'p', 'u', 'phonenumbers');
1502 $rsm->addFieldResult('p', 'p__phonenumber', 'phonenumber');
1508 'u__name' => 'romanb',
1510 'g__name' => 'TestGroupB',
1511 'p__phonenumber' => 1111,
1515 'u__name' => 'romanb',
1517 'g__name' => 'TestGroupD',
1518 'p__phonenumber' => 1111,
1522 'u__name' => 'romanb',
1524 'g__name' => 'TestGroupB',
1525 'p__phonenumber' => 2222,
1529 'u__name' => 'romanb',
1531 'g__name' => 'TestGroupD',
1532 'p__phonenumber' => 2222,
1536 'u__name' => 'jwage',
1538 'g__name' => 'TestGroupA',
1539 'p__phonenumber' => 3333,
1543 'u__name' => 'jwage',
1545 'g__name' => 'TestGroupB',
1546 'p__phonenumber' => 3333,
1550 'u__name' => 'jwage',
1552 'g__name' => 'TestGroupC',
1553 'p__phonenumber' => 3333,
1557 'u__name' => 'jwage',
1559 'g__name' => 'TestGroupD',
1560 'p__phonenumber' => 3333,
1564 'u__name' => 'jwage',
1566 'g__name' => 'TestGroupA',
1567 'p__phonenumber' => 4444,
1571 'u__name' => 'jwage',
1573 'g__name' => 'TestGroupB',
1574 'p__phonenumber' => 4444,
1578 'u__name' => 'jwage',
1580 'g__name' => 'TestGroupC',
1581 'p__phonenumber' => 4444,
1585 'u__name' => 'jwage',
1587 'g__name' => 'TestGroupD',
1588 'p__phonenumber' => 4444,
1592 $stmt = new HydratorMockStatement($resultSet);
1593 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
1594 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
1596 $this->assertEquals(2, count($result));
1598 $this->assertInternalType('array', $result[0]);
1599 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[0]['user']);
1600 $this->assertInternalType('array', $result[1]);
1601 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[1]['user']);
1603 $this->assertEquals(2, count($result[0]['user']->groups));
1604 $this->assertEquals(2, count($result[0]['user']->phonenumbers));
1606 $this->assertEquals(4, count($result[1]['user']->groups));
1607 $this->assertEquals(2, count($result[1]['user']->phonenumbers));
1611 * SELECT PARTIAL u.{id, status}, UPPER(u.name) as nameUpper
1612 * FROM Doctrine\Tests\Models\CMS\CmsUser u
1615 * @dataProvider provideDataForUserEntityResult
1617 public function testMissingIdForRootEntity($userEntityKey)
1619 $rsm = new ResultSetMapping;
1620 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $userEntityKey ?: null);
1621 $rsm->addFieldResult('u', 'u__id', 'id');
1622 $rsm->addFieldResult('u', 'u__status', 'status');
1623 $rsm->addScalarResult('sclr0', 'nameUpper');
1630 'u__status' => 'developer',
1631 'sclr0' => 'ROMANB',
1635 'u__status' => null,
1636 'sclr0' => 'ROMANB',
1640 'u__status' => 'developer',
1645 'u__status' => null,
1650 $stmt = new HydratorMockStatement($resultSet);
1651 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
1652 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
1654 $this->assertEquals(4, count($result), "Should hydrate four results.");
1656 $this->assertEquals('ROMANB', $result[0]['nameUpper']);
1657 $this->assertEquals('ROMANB', $result[1]['nameUpper']);
1658 $this->assertEquals('JWAGE', $result[2]['nameUpper']);
1659 $this->assertEquals('JWAGE', $result[3]['nameUpper']);
1661 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[0][$userEntityKey]);
1662 $this->assertNull($result[1][$userEntityKey]);
1664 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $result[2][$userEntityKey]);
1665 $this->assertNull($result[3][$userEntityKey]);
1669 * SELECT PARTIAL u.{id, status}, PARTIAL p.{phonenumber}, UPPER(u.name) AS nameUpper
1670 * FROM Doctrine\Tests\Models\CMS\CmsUser u
1671 * LEFT JOIN u.phonenumbers u
1674 * @dataProvider provideDataForUserEntityResult
1676 public function testMissingIdForCollectionValuedChildEntity($userEntityKey)
1678 $rsm = new ResultSetMapping;
1679 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $userEntityKey ?: null);
1680 $rsm->addJoinedEntityResult(
1681 'Doctrine\Tests\Models\CMS\CmsPhonenumber',
1686 $rsm->addFieldResult('u', 'u__id', 'id');
1687 $rsm->addFieldResult('u', 'u__status', 'status');
1688 $rsm->addScalarResult('sclr0', 'nameUpper');
1689 $rsm->addFieldResult('p', 'p__phonenumber', 'phonenumber');
1696 'u__status' => 'developer',
1697 'sclr0' => 'ROMANB',
1698 'p__phonenumber' => '42',
1702 'u__status' => 'developer',
1703 'sclr0' => 'ROMANB',
1704 'p__phonenumber' => null
1708 'u__status' => 'developer',
1710 'p__phonenumber' => '91'
1714 'u__status' => 'developer',
1716 'p__phonenumber' => null
1720 $stmt = new HydratorMockStatement($resultSet);
1721 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
1722 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
1724 $this->assertEquals(2, count($result));
1726 $this->assertEquals(1, $result[0][$userEntityKey]->phonenumbers->count());
1727 $this->assertEquals(1, $result[1][$userEntityKey]->phonenumbers->count());
1731 * SELECT PARTIAL u.{id, status}, PARTIAL a.{id, city}, UPPER(u.name) AS nameUpper
1732 * FROM Doctrine\Tests\Models\CMS\CmsUser u
1736 * @dataProvider provideDataForUserEntityResult
1738 public function testMissingIdForSingleValuedChildEntity($userEntityKey)
1740 $rsm = new ResultSetMapping;
1741 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $userEntityKey ?: null);
1742 $rsm->addJoinedEntityResult(
1743 'Doctrine\Tests\Models\CMS\CmsAddress',
1748 $rsm->addFieldResult('u', 'u__id', 'id');
1749 $rsm->addFieldResult('u', 'u__status', 'status');
1750 $rsm->addScalarResult('sclr0', 'nameUpper');
1751 $rsm->addFieldResult('a', 'a__id', 'id');
1752 $rsm->addFieldResult('a', 'a__city', 'city');
1753 $rsm->addMetaResult('a', 'user_id', 'user_id');
1760 'u__status' => 'developer',
1761 'sclr0' => 'ROMANB',
1763 'a__city' => 'Berlin',
1767 'u__status' => 'developer',
1768 'sclr0' => 'BENJAMIN',
1774 $stmt = new HydratorMockStatement($resultSet);
1775 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
1776 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
1778 $this->assertEquals(2, count($result));
1780 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddress', $result[0][$userEntityKey]->address);
1781 $this->assertNull($result[1][$userEntityKey]->address);
1785 * SELECT PARTIAL u.{id, status}, UPPER(u.name) AS nameUpper
1786 * FROM Doctrine\Tests\Models\CMS\CmsUser u
1790 * @dataProvider provideDataForUserEntityResult
1792 public function testIndexByAndMixedResult($userEntityKey)
1794 $rsm = new ResultSetMapping;
1795 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $userEntityKey ?: null);
1796 $rsm->addFieldResult('u', 'u__id', 'id');
1797 $rsm->addFieldResult('u', 'u__status', 'status');
1798 $rsm->addScalarResult('sclr0', 'nameUpper');
1799 $rsm->addIndexBy('u', 'id');
1806 'u__status' => 'developer',
1807 'sclr0' => 'ROMANB',
1811 'u__status' => 'developer',
1816 $stmt = new HydratorMockStatement($resultSet);
1817 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
1818 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
1820 $this->assertEquals(2, count($result));
1822 $this->assertTrue(isset($result[1]));
1823 $this->assertEquals(1, $result[1][$userEntityKey]->id);
1825 $this->assertTrue(isset($result[2]));
1826 $this->assertEquals(2, $result[2][$userEntityKey]->id);
1830 * SELECT UPPER(u.name) AS nameUpper
1831 * FROM Doctrine\Tests\Models\CMS\CmsUser u
1834 * @dataProvider provideDataForUserEntityResult
1836 public function testIndexByScalarsOnly($userEntityKey)
1838 $rsm = new ResultSetMapping;
1839 $rsm->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser', 'u', $userEntityKey ?: null);
1840 $rsm->addScalarResult('sclr0', 'nameUpper');
1841 $rsm->addIndexByScalar('sclr0');
1847 'sclr0' => 'ROMANB',
1854 $stmt = new HydratorMockStatement($resultSet);
1855 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
1856 $result = $hydrator->hydrateAll($stmt, $rsm, array(Query::HINT_FORCE_PARTIAL_LOAD => true));
1858 $this->assertEquals(
1860 'ROMANB' => array('nameUpper' => 'ROMANB'),
1861 'JWAGE' => array('nameUpper' => 'JWAGE')
1871 * @expectedException \Doctrine\ORM\Internal\Hydration\HydrationException
1872 * @expectedExceptionMessage The meta mapping for the discriminator column "c_discr" is missing for "Doctrine\Tests\Models\Company\CompanyFixContract" using the DQL alias "c".
1874 public function testMissingMetaMappingException()
1876 $rsm = new ResultSetMapping;
1878 $rsm->addEntityResult('Doctrine\Tests\Models\Company\CompanyFixContract', 'c');
1879 $rsm->addJoinedEntityResult('Doctrine\Tests\Models\Company\CompanyEmployee', 'e', 'c', 'salesPerson');
1881 $rsm->addFieldResult('c', 'c__id', 'id');
1882 $rsm->setDiscriminatorColumn('c', 'c_discr');
1891 $stmt = new HydratorMockStatement($resultSet);
1892 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
1893 $hydrator->hydrateAll($stmt, $rsm);
1899 * @expectedException \Doctrine\ORM\Internal\Hydration\HydrationException
1900 * @expectedExceptionMessage The discriminator column "discr" is missing for "Doctrine\Tests\Models\Company\CompanyEmployee" using the DQL alias "e".
1902 public function testMissingDiscriminatorColumnException()
1904 $rsm = new ResultSetMapping;
1906 $rsm->addEntityResult('Doctrine\Tests\Models\Company\CompanyFixContract', 'c');
1907 $rsm->addJoinedEntityResult('Doctrine\Tests\Models\Company\CompanyEmployee', 'e', 'c', 'salesPerson');
1909 $rsm->addFieldResult('c', 'c__id', 'id');
1910 $rsm->addMetaResult('c', 'c_discr', 'discr');
1911 $rsm->setDiscriminatorColumn('c', 'c_discr');
1913 $rsm->addFieldResult('e', 'e__id', 'id');
1914 $rsm->addFieldResult('e', 'e__name', 'name');
1915 $rsm->addMetaResult('e ', 'e_discr', 'discr');
1916 $rsm->setDiscriminatorColumn('e', 'e_discr');
1923 'e__name' => 'Fabio B. Silva'
1927 $stmt = new HydratorMockStatement($resultSet);
1928 $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
1929 $hydrator->hydrateAll($stmt, $rsm);