Failed Conditions
Pull Request — develop (#6873)
by
unknown
112:44 queued 47:41
created

testBasicNativeNamedQueryWithResultClass()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 46
Code Lines 34

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 34
nc 1
nop 0
dl 0
loc 46
rs 8.9411
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\Tests\ORM\Functional;
6
7
use Doctrine\Common\Collections\ArrayCollection;
8
use Doctrine\DBAL\Types\Type as DBALType;
9
use Doctrine\ORM\AbstractQuery;
10
use Doctrine\ORM\Internal\Hydration\HydrationException;
11
use Doctrine\ORM\PersistentCollection;
12
use Doctrine\ORM\Query\Parameter;
13
use Doctrine\ORM\Query\ResultSetMapping;
14
use Doctrine\ORM\Query\ResultSetMappingBuilder;
15
use Doctrine\Tests\Models\CMS\CmsAddress;
16
use Doctrine\Tests\Models\CMS\CmsEmail;
17
use Doctrine\Tests\Models\CMS\CmsPhonenumber;
18
use Doctrine\Tests\Models\CMS\CmsUser;
19
use Doctrine\Tests\Models\Company\CompanyContract;
20
use Doctrine\Tests\Models\Company\CompanyEmployee;
21
use Doctrine\Tests\Models\Company\CompanyFixContract;
22
use Doctrine\Tests\Models\Company\CompanyFlexContract;
23
use Doctrine\Tests\Models\Company\CompanyPerson;
24
use Doctrine\Tests\Models\DDC3899\DDC3899FixContract;
25
use Doctrine\Tests\Models\DDC3899\DDC3899User;
26
use Doctrine\Tests\OrmFunctionalTestCase;
27
28
/**
29
 * NativeQueryTest
30
 *
31
 * @author robo
32
 */
33
class NativeQueryTest extends OrmFunctionalTestCase
34
{
35
    private $platform = null;
36
37
    protected function setUp()
38
    {
39
        $this->useModelSet('cms');
40
        $this->useModelSet('company');
41
42
        parent::setUp();
43
44
        $this->platform = $this->em->getConnection()->getDatabasePlatform();
45
    }
46
47
    public function testBasicNativeQuery()
48
    {
49
        $user = new CmsUser;
50
51
        $user->name = 'Roman';
52
        $user->username = 'romanb';
53
        $user->status = 'dev';
54
55
        $this->em->persist($user);
56
        $this->em->flush();
57
        $this->em->clear();
58
59
        $rsm = new ResultSetMapping;
60
61
        $rsm->addEntityResult(CmsUser::class, 'u');
62
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('id'), 'id');
63
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('name'), 'name');
64
65
        $query = $this->em->createNativeQuery('SELECT id, name FROM cms_users WHERE username = ?', $rsm);
66
67
        $query->setParameter(1, 'romanb');
68
69
        $users = $query->getResult();
70
71
        self::assertCount(1, $users);
72
        self::assertInstanceOf(CmsUser::class, $users[0]);
73
        self::assertEquals('Roman', $users[0]->name);
74
    }
75
76
    public function testBasicNativeQueryWithMetaResult()
77
    {
78
        $user = new CmsUser;
79
80
        $user->name = 'Roman';
81
        $user->username = 'romanb';
82
        $user->status = 'dev';
83
84
        $addr = new CmsAddress;
85
86
        $addr->country = 'germany';
87
        $addr->zip = 10827;
88
        $addr->city = 'Berlin';
89
90
        $user->setAddress($addr);
91
92
        $this->em->persist($user);
93
        $this->em->flush();
94
        $this->em->clear();
95
96
        $rsm = new ResultSetMapping;
97
98
        $rsm->addEntityResult(CmsAddress::class, 'a');
99
        $rsm->addFieldResult('a', $this->platform->getSQLResultCasing('id'), 'id');
100
        $rsm->addFieldResult('a', $this->platform->getSQLResultCasing('country'), 'country');
101
        $rsm->addFieldResult('a', $this->platform->getSQLResultCasing('zip'), 'zip');
102
        $rsm->addFieldResult('a', $this->platform->getSQLResultCasing('city'), 'city');
103
        $rsm->addMetaResult('a', $this->platform->getSQLResultCasing('user_id'), 'user_id', false, DBALType::getType('integer'));
104
105
        $query = $this->em->createNativeQuery('SELECT a.id, a.country, a.zip, a.city, a.user_id FROM cms_addresses a WHERE a.id = ?', $rsm);
106
107
        $query->setParameter(1, $addr->id);
108
109
        $addresses = $query->getResult();
110
111
        self::assertCount(1, $addresses);
112
        self::assertInstanceOf(CmsAddress::class, $addresses[0]);
113
        self::assertEquals($addr->country, $addresses[0]->country);
114
        self::assertEquals($addr->zip, $addresses[0]->zip);
115
        self::assertEquals($addr->city, $addresses[0]->city);
116
        self::assertEquals($addr->street, $addresses[0]->street);
117
        self::assertInstanceOf(CmsUser::class, $addresses[0]->user);
118
    }
119
120
    public function testJoinedOneToManyNativeQuery()
121
    {
122
        $user = new CmsUser;
123
124
        $user->name = 'Roman';
125
        $user->username = 'romanb';
126
        $user->status = 'dev';
127
128
        $phone = new CmsPhonenumber;
129
130
        $phone->phonenumber = 424242;
131
132
        $user->addPhonenumber($phone);
133
134
        $this->em->persist($user);
135
        $this->em->flush();
136
        $this->em->clear();
137
138
        $rsm = new ResultSetMapping;
139
140
        $rsm->addEntityResult(CmsUser::class, 'u');
141
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('id'), 'id');
142
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('name'), 'name');
143
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('status'), 'status');
144
        $rsm->addJoinedEntityResult(CmsPhonenumber::class, 'p', 'u', 'phonenumbers');
145
        $rsm->addFieldResult('p', $this->platform->getSQLResultCasing('phonenumber'), 'phonenumber');
146
147
        $query = $this->em->createNativeQuery('SELECT id, name, status, phonenumber FROM cms_users INNER JOIN cms_phonenumbers ON id = user_id WHERE username = ?', $rsm);
148
149
        $query->setParameter(1, 'romanb');
150
151
        $users = $query->getResult();
152
153
        self::assertCount(1, $users);
154
        self::assertInstanceOf(CmsUser::class, $users[0]);
155
        self::assertEquals('Roman', $users[0]->name);
156
        self::assertInstanceOf(PersistentCollection::class, $users[0]->getPhonenumbers());
157
        self::assertTrue($users[0]->getPhonenumbers()->isInitialized());
158
        self::assertCount(1, $users[0]->getPhonenumbers());
159
160
        $phones = $users[0]->getPhonenumbers();
161
162
        self::assertEquals(424242, $phones[0]->phonenumber);
163
        self::assertSame($phones[0]->getUser(), $users[0]);
164
    }
165
166
    public function testJoinedOneToOneNativeQuery()
167
    {
168
        $user = new CmsUser;
169
170
        $user->name = 'Roman';
171
        $user->username = 'romanb';
172
        $user->status = 'dev';
173
174
        $addr = new CmsAddress;
175
176
        $addr->country = 'germany';
177
        $addr->zip = 10827;
178
        $addr->city = 'Berlin';
179
180
        $user->setAddress($addr);
181
182
        $this->em->persist($user);
183
        $this->em->flush();
184
        $this->em->clear();
185
186
        $rsm = new ResultSetMapping;
187
188
        $rsm->addEntityResult(CmsUser::class, 'u');
189
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('id'), 'id');
190
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('name'), 'name');
191
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('status'), 'status');
192
        $rsm->addJoinedEntityResult(CmsAddress::class, 'a', 'u', 'address');
193
        $rsm->addFieldResult('a', $this->platform->getSQLResultCasing('a_id'), 'id');
194
        $rsm->addFieldResult('a', $this->platform->getSQLResultCasing('country'), 'country');
195
        $rsm->addFieldResult('a', $this->platform->getSQLResultCasing('zip'), 'zip');
196
        $rsm->addFieldResult('a', $this->platform->getSQLResultCasing('city'), 'city');
197
198
        $query = $this->em->createNativeQuery('SELECT u.id, u.name, u.status, a.id AS a_id, a.country, a.zip, a.city FROM cms_users u INNER JOIN cms_addresses a ON u.id = a.user_id WHERE u.username = ?', $rsm);
199
200
        $query->setParameter(1, 'romanb');
201
202
        $users = $query->getResult();
203
204
        self::assertCount(1, $users);
205
        self::assertInstanceOf(CmsUser::class, $users[0]);
206
        self::assertEquals('Roman', $users[0]->name);
207
        self::assertInstanceOf(PersistentCollection::class, $users[0]->getPhonenumbers());
208
        self::assertFalse($users[0]->getPhonenumbers()->isInitialized());
209
        self::assertInstanceOf(CmsAddress::class, $users[0]->getAddress());
210
        self::assertEquals($users[0]->getAddress()->getUser(), $users[0]);
211
        self::assertEquals('germany', $users[0]->getAddress()->getCountry());
212
        self::assertEquals(10827, $users[0]->getAddress()->getZipCode());
213
        self::assertEquals('Berlin', $users[0]->getAddress()->getCity());
214
    }
215
216
    public function testFluentInterface()
217
    {
218
        $parameters = new ArrayCollection;
219
220
        $parameters->add(new Parameter(1, 'foo'));
221
        $parameters->add(new Parameter(2, 'bar'));
222
223
        $rsm = new ResultSetMapping;
224
225
        $q = $this->em->createNativeQuery('SELECT id, name, status, phonenumber FROM cms_users INNER JOIN cms_phonenumbers ON id = user_id WHERE username = ?', $rsm);
226
        $q2 = $q->setSQL('foo')
227
          ->setResultSetMapping($rsm)
228
          ->expireResultCache(true)
229
          ->setHint('foo', 'bar')
230
          ->setParameter(1, 'foo')
231
          ->setParameters($parameters)
232
          ->setResultCacheDriver(null)
233
          ->setResultCacheLifetime(3500);
234
235
        self::assertSame($q, $q2);
236
    }
237
238
    public function testJoinedOneToManyNativeQueryWithRSMBuilder()
239
    {
240
        $user = new CmsUser;
241
242
        $user->name = 'Roman';
243
        $user->username = 'romanb';
244
        $user->status = 'dev';
245
246
        $phone = new CmsPhonenumber;
247
248
        $phone->phonenumber = 424242;
249
250
        $user->addPhonenumber($phone);
251
252
        $this->em->persist($user);
253
        $this->em->flush();
254
        $this->em->clear();
255
256
        $rsm = new ResultSetMappingBuilder($this->em);
257
258
        $rsm->addRootEntityFromClassMetadata(CmsUser::class, 'u');
259
        $rsm->addJoinedEntityFromClassMetadata(CmsPhonenumber::class, 'p', 'u', 'phonenumbers');
260
        $query = $this->em->createNativeQuery('SELECT u.*, p.* FROM cms_users u LEFT JOIN cms_phonenumbers p ON u.id = p.user_id WHERE username = ?', $rsm);
261
262
        $query->setParameter(1, 'romanb');
263
264
        $users = $query->getResult();
265
266
        self::assertCount(1, $users);
267
        self::assertInstanceOf(CmsUser::class, $users[0]);
268
        self::assertEquals('Roman', $users[0]->name);
269
        self::assertInstanceOf(PersistentCollection::class, $users[0]->getPhonenumbers());
270
        self::assertTrue($users[0]->getPhonenumbers()->isInitialized());
271
        self::assertCount(1, $users[0]->getPhonenumbers());
272
273
        $phones = $users[0]->getPhonenumbers();
274
275
        self::assertEquals(424242, $phones[0]->phonenumber);
276
        self::assertSame($phones[0]->getUser(), $users[0]);
277
278
        $this->em->clear();
279
280
        $rsm = new ResultSetMappingBuilder($this->em);
281
282
        $rsm->addRootEntityFromClassMetadata(CmsPhonenumber::class, 'p');
283
284
        $query = $this->em->createNativeQuery('SELECT p.* FROM cms_phonenumbers p WHERE p.phonenumber = ?', $rsm);
285
286
        $query->setParameter(1, $phone->phonenumber);
287
288
        $phone = $query->getSingleResult();
289
290
        self::assertNotNull($phone->getUser());
291
        self::assertEquals($user->name, $phone->getUser()->getName());
292
    }
293
294
    public function testJoinedOneToOneNativeQueryWithRSMBuilder()
295
    {
296
        $user = new CmsUser;
297
298
        $user->name = 'Roman';
299
        $user->username = 'romanb';
300
        $user->status = 'dev';
301
302
        $addr = new CmsAddress;
303
304
        $addr->country = 'germany';
305
        $addr->zip = 10827;
306
        $addr->city = 'Berlin';
307
308
        $user->setAddress($addr);
309
310
        $this->em->persist($user);
311
        $this->em->flush();
312
        $this->em->clear();
313
314
        $rsm = new ResultSetMappingBuilder($this->em);
315
316
        $rsm->addRootEntityFromClassMetadata(CmsUser::class, 'u');
317
        $rsm->addJoinedEntityFromClassMetadata(CmsAddress::class, 'a', 'u', 'address', ['id' => 'a_id']);
318
319
        $query = $this->em->createNativeQuery('SELECT u.*, a.*, a.id AS a_id FROM cms_users u INNER JOIN cms_addresses a ON u.id = a.user_id WHERE u.username = ?', $rsm);
320
321
        $query->setParameter(1, 'romanb');
322
323
        $users = $query->getResult();
324
325
        self::assertCount(1, $users);
326
        self::assertInstanceOf(CmsUser::class, $users[0]);
327
        self::assertEquals('Roman', $users[0]->name);
328
        self::assertInstanceOf(PersistentCollection::class, $users[0]->getPhonenumbers());
329
        self::assertFalse($users[0]->getPhonenumbers()->isInitialized());
330
        self::assertInstanceOf(CmsAddress::class, $users[0]->getAddress());
331
        self::assertEquals($users[0]->getAddress()->getUser(), $users[0]);
332
        self::assertEquals('germany', $users[0]->getAddress()->getCountry());
333
        self::assertEquals(10827, $users[0]->getAddress()->getZipCode());
334
        self::assertEquals('Berlin', $users[0]->getAddress()->getCity());
335
336
        $this->em->clear();
337
338
        $rsm = new ResultSetMappingBuilder($this->em);
339
340
        $rsm->addRootEntityFromClassMetadata(CmsAddress::class, 'a');
341
342
        $query = $this->em->createNativeQuery('SELECT a.* FROM cms_addresses a WHERE a.id = ?', $rsm);
343
344
        $query->setParameter(1, $addr->getId());
345
346
        $address = $query->getSingleResult();
347
348
        self::assertNotNull($address->getUser());
349
        self::assertEquals($user->name, $address->getUser()->getName());
350
    }
351
352
    /**
353
     * @group rsm-sti
354
     */
355
    public function testConcreteClassInSingleTableInheritanceSchemaWithRSMBuilderIsFine()
356
    {
357
        $rsm = new ResultSetMappingBuilder($this->em);
358
359
        $rsm->addRootEntityFromClassMetadata(CompanyFixContract::class, 'c');
360
361
        self::assertSame(CompanyFixContract::class, $rsm->getClassName('c'));
362
    }
363
364
    /**
365
     * @group rsm-sti
366
     */
367
    public function testAbstractClassInSingleTableInheritanceSchemaWithRSMBuilderThrowsException()
368
    {
369
        $this->expectException(\InvalidArgumentException::class);
370
        $this->expectExceptionMessage('ResultSetMapping builder does not currently support your inheritance scheme.');
371
372
        $rsm = new ResultSetMappingBuilder($this->em);
373
374
        $rsm->addRootEntityFromClassMetadata(CompanyContract::class, 'c');
375
    }
376
377
    /**
378
     * @expectedException \InvalidArgumentException
379
     */
380
    public function testRSMBuilderThrowsExceptionOnColumnConflict()
381
    {
382
        $rsm = new ResultSetMappingBuilder($this->em);
383
384
        $rsm->addRootEntityFromClassMetadata(CmsUser::class, 'u');
385
        $rsm->addJoinedEntityFromClassMetadata(CmsAddress::class, 'a', 'u', 'address');
386
    }
387
388
    /**
389
     * @group PR-39
390
     */
391
    public function testUnknownParentAliasThrowsException()
392
    {
393
        $rsm = new ResultSetMappingBuilder($this->em);
394
395
        $rsm->addRootEntityFromClassMetadata(CmsUser::class, 'u');
396
        $rsm->addJoinedEntityFromClassMetadata(CmsAddress::class, 'a', 'un', 'address', ['id' => 'a_id']);
397
398
        $query = $this->em->createNativeQuery('SELECT u.*, a.*, a.id AS a_id FROM cms_users u INNER JOIN cms_addresses a ON u.id = a.user_id WHERE u.username = ?', $rsm);
399
400
        $query->setParameter(1, 'romanb');
401
402
        $this->expectException(HydrationException::class);
403
        $this->expectExceptionMessage("The parent object of entity result with alias 'a' was not found. The parent alias is 'un'.");
404
405
        $query->getResult();
406
    }
407
408
409
    /**
410
     * @group DDC-1663
411
     */
412
    public function testBasicNativeNamedQueryWithSqlResultSetMapping()
413
    {
414
        $user = new CmsUser;
415
416
        $user->name     = 'Fabio B. Silva';
417
        $user->username = 'FabioBatSilva';
418
        $user->status   = 'dev';
419
420
        $addr = new CmsAddress;
421
422
        $addr->country  = 'Brazil';
423
        $addr->zip      = 10827;
424
        $addr->city     = 'São Paulo';
425
426
        $user->setAddress($addr);
427
428
        $this->em->clear();
429
        $this->em->persist($user);
430
        $this->em->flush();
431
        $this->em->clear();
432
433
        $repository = $this->em->getRepository(CmsAddress::class);
434
        $query      = $repository->createNativeNamedQuery('find-all');
435
        $result     = $query->getResult();
436
437
        self::assertCount(1, $result);
438
        self::assertInstanceOf(CmsAddress::class, $result[0]);
439
        self::assertEquals($addr->id,  $result[0]->id);
440
        self::assertEquals($addr->city,  $result[0]->city);
441
        self::assertEquals($addr->country, $result[0]->country);
442
    }
443
444
    /**
445
     * @group DDC-1663
446
     */
447
    public function testBasicNativeNamedQueryWithResultClass()
448
    {
449
        $user = new CmsUser;
450
451
        $user->name     = 'Fabio B. Silva';
452
        $user->username = 'FabioBatSilva';
453
        $user->status   = 'dev';
454
455
        $email = new CmsEmail();
456
457
        $email->email   = '[email protected]';
458
459
        $user->setEmail($email);
460
461
        $this->em->clear();
462
        $this->em->persist($user);
463
        $this->em->flush();
464
        $this->em->clear();
465
466
        $repository = $this->em->getRepository(CmsUser::class);
467
        $result     = $repository
468
            ->createNativeNamedQuery('fetchIdAndUsernameWithResultClass')
469
            ->setParameter(1, 'FabioBatSilva')
470
            ->getResult();
471
472
        self::assertCount(1, $result);
473
        self::assertInstanceOf(CmsUser::class, $result[0]);
474
        self::assertNull($result[0]->name);
475
        self::assertNull($result[0]->email);
476
        self::assertEquals($user->id, $result[0]->id);
477
        self::assertEquals('FabioBatSilva', $result[0]->username);
478
479
        $this->em->clear();
480
481
        $result = $repository
482
            ->createNativeNamedQuery('fetchAllColumns')
483
            ->setParameter(1, 'FabioBatSilva')
484
            ->getResult();
485
486
        self::assertCount(1, $result);
487
        self::assertInstanceOf(CmsUser::class, $result[0]);
488
        self::assertEquals($user->id, $result[0]->id);
489
        self::assertEquals('Fabio B. Silva', $result[0]->name);
490
        self::assertEquals('FabioBatSilva', $result[0]->username);
491
        self::assertEquals('dev', $result[0]->status);
492
        self::assertInstanceOf(CmsEmail::class, $result[0]->email);
493
    }
494
495
    /**
496
     * @group DDC-1663
497
     */
498
    public function testJoinedOneToOneNativeNamedQueryWithResultSetMapping()
499
    {
500
        $user           = new CmsUser;
501
        $user->name     = 'Fabio B. Silva';
502
        $user->username = 'FabioBatSilva';
503
        $user->status   = 'dev';
504
505
        $addr           = new CmsAddress;
506
        $addr->country  = 'Brazil';
507
        $addr->zip      = 10827;
508
        $addr->city     = 'São Paulo';
509
510
        $user->setAddress($addr);
511
512
        $this->em->persist($user);
513
        $this->em->flush();
514
        $this->em->clear();
515
516
        $repository = $this->em->getRepository(CmsUser::class);
517
518
        $result = $repository
519
            ->createNativeNamedQuery('fetchJoinedAddress')
520
            ->setParameter(1, 'FabioBatSilva')
521
            ->getResult();
522
523
        self::assertCount(1, $result);
524
        self::assertInstanceOf(CmsUser::class, $result[0]);
525
        self::assertEquals('Fabio B. Silva', $result[0]->name);
526
        self::assertInstanceOf(PersistentCollection::class, $result[0]->getPhonenumbers());
527
        self::assertFalse($result[0]->getPhonenumbers()->isInitialized());
528
        self::assertInstanceOf(CmsAddress::class, $result[0]->getAddress());
529
        self::assertEquals($result[0]->getAddress()->getUser(), $result[0]);
530
        self::assertEquals('Brazil', $result[0]->getAddress()->getCountry());
531
        self::assertEquals(10827, $result[0]->getAddress()->getZipCode());
532
        self::assertEquals('São Paulo', $result[0]->getAddress()->getCity());
533
    }
534
535
    /**
536
     * @group DDC-1663
537
     */
538
    public function testJoinedOneToManyNativeNamedQueryWithResultSetMapping()
539
    {
540
        $user               = new CmsUser;
541
        $user->name         = 'Fabio B. Silva';
542
        $user->username     = 'FabioBatSilva';
543
        $user->status       = 'dev';
544
545
        $phone              = new CmsPhonenumber;
546
        $phone->phonenumber = 424242;
547
548
        $user->addPhonenumber($phone);
549
550
        $this->em->persist($user);
551
        $this->em->flush();
552
553
        $this->em->clear();
554
555
        $repository = $this->em->getRepository(CmsUser::class);
556
557
        $result = $repository->createNativeNamedQuery('fetchJoinedPhonenumber')
558
                        ->setParameter(1, 'FabioBatSilva')->getResult();
559
560
        self::assertCount(1, $result);
561
        self::assertInstanceOf(CmsUser::class, $result[0]);
562
        self::assertEquals('Fabio B. Silva', $result[0]->name);
563
        self::assertInstanceOf(PersistentCollection::class, $result[0]->getPhonenumbers());
564
        self::assertTrue($result[0]->getPhonenumbers()->isInitialized());
565
        self::assertCount(1, $result[0]->getPhonenumbers());
566
        $phones = $result[0]->getPhonenumbers();
567
        self::assertEquals(424242, $phones[0]->phonenumber);
568
        self::assertSame($phones[0]->getUser(), $result[0]);
569
    }
570
571
    /**
572
     * @group DDC-1663
573
     */
574
    public function testMixedNativeNamedQueryNormalJoin()
575
    {
576
        $user1 = new CmsUser;
577
578
        $user1->name            = 'Fabio B. Silva';
579
        $user1->username        = 'FabioBatSilva';
580
        $user1->status          = 'dev';
581
582
        $user2 = new CmsUser;
583
584
        $user2->name            = 'test tester';
585
        $user2->username        = 'test';
586
        $user2->status          = 'tester';
587
588
        $phone1 = new CmsPhonenumber;
589
        $phone2 = new CmsPhonenumber;
590
        $phone3 = new CmsPhonenumber;
591
592
        $phone1->phonenumber    = 11111111;
593
        $phone2->phonenumber    = 22222222;
594
        $phone3->phonenumber    = 33333333;
595
596
        $user1->addPhonenumber($phone1);
597
        $user1->addPhonenumber($phone2);
598
        $user2->addPhonenumber($phone3);
599
600
        $this->em->persist($user1);
601
        $this->em->persist($user2);
602
        $this->em->flush();
603
        $this->em->clear();
604
605
        $repository = $this->em->getRepository(CmsUser::class);
606
        $result     = $repository
607
            ->createNativeNamedQuery('fetchUserPhonenumberCount')
608
            ->setParameter(1, ['test','FabioBatSilva'])->getResult();
609
610
        self::assertCount(2, $result);
611
        self::assertInternalType('array', $result[0]);
612
        self::assertInternalType('array', $result[1]);
613
614
        // first user => 2 phonenumbers
615
        self::assertInstanceOf(CmsUser::class, $result[0][0]);
616
        self::assertEquals('Fabio B. Silva', $result[0][0]->name);
617
        self::assertEquals(2, $result[0]['numphones']);
618
619
        // second user => 1 phonenumbers
620
        self::assertInstanceOf(CmsUser::class, $result[1][0]);
621
        self::assertEquals('test tester', $result[1][0]->name);
622
        self::assertEquals(1, $result[1]['numphones']);
623
    }
624
625
    /**
626
     * @group DDC-1663
627
     */
628
    public function testNativeNamedQueryInheritance()
629
    {
630
        $person = new CompanyPerson;
631
632
        $person->setName('Fabio B. Silva');
633
634
        $employee = new CompanyEmployee;
635
636
        $employee->setName('Fabio Silva');
637
        $employee->setSalary(100000);
638
        $employee->setDepartment('IT');
639
640
        $this->em->persist($person);
641
        $this->em->persist($employee);
642
        $this->em->flush();
643
        $this->em->clear();
644
645
        $repository = $this->em->getRepository(CompanyPerson::class);
646
        $result     = $repository
647
            ->createNativeNamedQuery('fetchAllWithSqlResultSetMapping')
648
            ->getResult();
649
650
        self::assertCount(2, $result);
651
        self::assertInstanceOf(CompanyPerson::class, $result[0]);
652
        self::assertInstanceOf(CompanyEmployee::class, $result[1]);
653
        self::assertInternalType('numeric', $result[0]->getId());
654
        self::assertInternalType('numeric', $result[1]->getId());
655
        self::assertEquals('Fabio B. Silva', $result[0]->getName());
656
        self::assertEquals('Fabio Silva', $result[1]->getName());
657
658
        $this->em->clear();
659
660
        $result = $repository
661
            ->createNativeNamedQuery('fetchAllWithResultClass')
662
            ->getResult();
663
664
        self::assertCount(2, $result);
665
        self::assertInstanceOf(CompanyPerson::class, $result[0]);
666
        self::assertInstanceOf(CompanyEmployee::class, $result[1]);
667
        self::assertInternalType('numeric', $result[0]->getId());
668
        self::assertInternalType('numeric', $result[1]->getId());
669
        self::assertEquals('Fabio B. Silva', $result[0]->getName());
670
        self::assertEquals('Fabio Silva', $result[1]->getName());
671
    }
672
673
    /**
674
     * @group DDC-1663
675
     * DQL : SELECT u, a, COUNT(p) AS numphones FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.address a JOIN u.phonenumbers p
676
     */
677
    public function testMultipleEntityResults()
678
    {
679
        $user = new CmsUser;
680
681
        $user->name         = 'Fabio B. Silva';
682
        $user->username     = 'FabioBatSilva';
683
        $user->status       = 'dev';
684
685
        $addr = new CmsAddress;
686
687
        $addr->country      = 'Brazil';
688
        $addr->zip          = 10827;
689
        $addr->city         = 'São Paulo';
690
691
        $phone = new CmsPhonenumber;
692
693
        $phone->phonenumber = 424242;
694
695
        $user->setAddress($addr);
696
        $user->addPhonenumber($phone);
697
698
        $this->em->clear();
699
        $this->em->persist($user);
700
        $this->em->flush();
701
        $this->em->clear();
702
703
704
        $repository = $this->em->getRepository(CmsUser::class);
705
        $query      = $repository->createNativeNamedQuery('fetchMultipleJoinsEntityResults');
706
        $result     = $query->getResult();
707
708
        self::assertCount(1, $result);
709
        self::assertInternalType('array', $result[0]);
710
        self::assertInstanceOf(CmsUser::class, $result[0][0]);
711
        self::assertEquals('Fabio B. Silva', $result[0][0]->name);
712
        self::assertInstanceOf(CmsAddress::class, $result[0][0]->getAddress());
713
        self::assertEquals($result[0][0]->getAddress()->getUser(), $result[0][0]);
714
        self::assertEquals('Brazil', $result[0][0]->getAddress()->getCountry());
715
        self::assertEquals(10827, $result[0][0]->getAddress()->getZipCode());
716
717
        self::assertEquals(1, $result[0]['numphones']);
718
    }
719
720
    /**
721
     * @group DDC-1663
722
     * @dataProvider provideDataForNamedNativeQueryInheritance
723
     *
724
     * @param $className
725
     */
726
    public function testNamedNativeQueryInheritance($className)
727
    {
728
        $classMetadata        = $this->em->getClassMetadata($className);
729
        $repository           = $this->em->getRepository($className);
730
        $namedNativeQueries   = $classMetadata->getNamedNativeQueries();
0 ignored issues
show
Bug introduced by
The method getNamedNativeQueries() does not exist on Doctrine\Common\Persistence\Mapping\ClassMetadata. Did you maybe mean getName()? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

730
        /** @scrutinizer ignore-call */ 
731
        $namedNativeQueries   = $classMetadata->getNamedNativeQueries();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
731
        $sqlResultSetMappings = $classMetadata->getSqlResultSetMappings();
732
733
        // Native Query Mappings
734
        self::assertArrayHasKey('all-contracts', $namedNativeQueries);
735
        self::assertEquals('__CLASS__', $namedNativeQueries['all-contracts']['resultClass']);
736
737
        self::assertArrayHasKey('all', $namedNativeQueries);
738
        self::assertEquals('__CLASS__', $namedNativeQueries['all']['resultClass']);
739
740
        // SQL ResultSet Mappings
741
        self::assertArrayHasKey('mapping-all-contracts', $sqlResultSetMappings);
742
        self::assertEquals('__CLASS__', $sqlResultSetMappings['mapping-all-contracts']['entities'][0]['entityClass']);
743
744
        self::assertArrayHasKey('mapping-all', $sqlResultSetMappings);
745
        self::assertEquals('__CLASS__', $sqlResultSetMappings['mapping-all']['entities'][0]['entityClass']);
746
747
        // Resolved Native Query Mappings
748
        $allContractsNativeNamedQuery = $repository->createNativeNamedQuery('all-contracts');
749
        $allNativeNamedQuery          = $repository->createNativeNamedQuery('all');
750
751
        self::assertEquals($className, $this->getResultSetMapping($allContractsNativeNamedQuery)->getClassName('e0'));
752
        self::assertEquals($className, $this->getResultSetMapping($allNativeNamedQuery)->getClassName('e0'));
753
    }
754
755
    public function provideDataForNamedNativeQueryInheritance()
756
    {
757
        return [
758
            [CompanyContract::class],
759
            [CompanyFlexContract::class],
760
        ];
761
    }
762
763
    /**
764
     * @group DDC-2055
765
     */
766
    public function testGenerateSelectClauseNoRenameSingleEntity()
767
    {
768
        $rsm = new ResultSetMappingBuilder($this->em);
769
770
        $rsm->addRootEntityFromClassMetadata(CmsUser::class, 'u');
771
772
        $selectClause = $rsm->generateSelectClause();
773
774
        self::assertSQLEquals('u.id AS id, u.status AS status, u.username AS username, u.name AS name, u.email_id AS email_id', $selectClause);
775
    }
776
777
    /**
778
     * @group DDC-2055
779
     */
780 View Code Duplication
    public function testGenerateSelectClauseCustomRenames()
781
    {
782
        $rsm = new ResultSetMappingBuilder($this->em);
783
784
        $rsm->addRootEntityFromClassMetadata(
785
            CmsUser::class,
786
            'u',
787
            [
788
                'id' => 'id1',
789
                'username' => 'username2'
790
            ]
791
        );
792
793
        $selectClause = $rsm->generateSelectClause();
794
795
        self::assertSQLEquals('u.id AS id1, u.status AS status, u.username AS username2, u.name AS name, u.email_id AS email_id', $selectClause);
796
    }
797
798
    /**
799
     * @group DDC-2055
800
     */
801 View Code Duplication
    public function testGenerateSelectClauseRenameTableAlias()
802
    {
803
        $rsm = new ResultSetMappingBuilder($this->em);
804
805
        $rsm->addRootEntityFromClassMetadata(CmsUser::class, 'u');
806
807
        $selectClause = $rsm->generateSelectClause(['u' => 'u1']);
808
809
        self::assertSQLEquals('u1.id AS id, u1.status AS status, u1.username AS username, u1.name AS name, u1.email_id AS email_id', $selectClause);
810
    }
811
812
    /**
813
     * @group DDC-2055
814
     */
815
    public function testGenerateSelectClauseIncrement()
816
    {
817
        $rsm = new ResultSetMappingBuilder($this->em, ResultSetMappingBuilder::COLUMN_RENAMING_INCREMENT);
818
819
        $rsm->addRootEntityFromClassMetadata(CmsUser::class, 'u');
820
821
        $selectClause = $rsm->generateSelectClause();
822
823
        self::assertSQLEquals('u.id AS id0, u.status AS status1, u.username AS username2, u.name AS name3, u.email_id AS email_id4', $selectClause);
824
    }
825
826
    /**
827
     * @group DDC-2055
828
     */
829
    public function testGenerateSelectClauseToString()
830
    {
831
        $rsm = new ResultSetMappingBuilder($this->em, ResultSetMappingBuilder::COLUMN_RENAMING_INCREMENT);
832
833
        $rsm->addRootEntityFromClassMetadata(CmsUser::class, 'u');
834
835
        self::assertSQLEquals('u.id AS id0, u.status AS status1, u.username AS username2, u.name AS name3, u.email_id AS email_id4', (string)$rsm);
836
    }
837
838
    /**
839
     * @group DDC-3899
840
     */
841
    public function testGenerateSelectClauseWithDiscriminatorColumn()
842
    {
843
        $rsm = new ResultSetMappingBuilder($this->em, ResultSetMappingBuilder::COLUMN_RENAMING_INCREMENT);
844
845
        $rsm->addEntityResult(DDC3899User::class, 'u');
846
        $rsm->addJoinedEntityResult(DDC3899FixContract::class, 'c', 'u', 'contracts');
847
        $rsm->addFieldResult('u', $this->platform->getSQLResultCasing('id'), 'id');
848
        $rsm->setDiscriminatorColumn('c', $this->platform->getSQLResultCasing('discr'));
849
850
        $selectClause = $rsm->generateSelectClause(['u' => 'u1', 'c' => 'c1']);
851
852
        self::assertSQLEquals('u1.id as id, c1.discr as discr', $selectClause);
853
    }
854
855
    protected function getResultSetMapping(AbstractQuery $query) : ResultSetMapping
856
    {
857
        $reflClass  = new \ReflectionClass($query);
858
        $reflMethod = $reflClass->getMethod('getResultSetMapping');
859
860
        $reflMethod->setAccessible(true);
861
862
        return $reflMethod->invoke($query);
863
    }
864
}
865