Completed
Pull Request — master (#5580)
by Marco
10:58
created

QueryBuilderTest::testSetParameters()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 15
Code Lines 10

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 15
rs 9.4286
cc 1
eloc 10
nc 1
nop 0
1
<?php
2
/*
3
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14
 *
15
 * This software consists of voluntary contributions made by many individuals
16
 * and is licensed under the LGPL. For more information, see
17
 * <http://www.doctrine-project.org>.
18
 */
19
20
namespace Doctrine\Tests\ORM;
21
22
use Doctrine\Common\Collections\ArrayCollection;
23
use Doctrine\Common\Collections\Criteria;
24
use Doctrine\ORM\Cache;
25
26
use Doctrine\ORM\QueryBuilder;
27
use Doctrine\ORM\Query\Expr;
28
use Doctrine\ORM\Query\Parameter;
29
use Doctrine\ORM\Query\ParameterTypeInferer;
30
31
/**
32
 * Test case for the QueryBuilder class used to build DQL query string in a
33
 * object oriented way.
34
 *
35
 * @author      Jonathan H. Wage <[email protected]>
36
 * @author      Roman Borschel <[email protected]
37
 * @since       2.0
38
 */
39
class QueryBuilderTest extends \Doctrine\Tests\OrmTestCase
40
{
41
    /**
42
     * @var \Doctrine\ORM\EntityManager
43
     */
44
    private $_em;
45
46
    protected function setUp()
47
    {
48
        $this->_em = $this->_getTestEntityManager();
49
    }
50
51
    protected function assertValidQueryBuilder(QueryBuilder $qb, $expectedDql)
52
    {
53
        $dql = $qb->getDql();
54
        $q = $qb->getQuery();
0 ignored issues
show
Unused Code introduced by
$q is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
55
56
        $this->assertEquals($expectedDql, $dql);
57
    }
58
59
    public function testSelectSetsType()
60
    {
61
        $qb = $this->_em->createQueryBuilder()
62
            ->delete('Doctrine\Tests\Models\CMS\CmsUser', 'u')
63
            ->select('u.id', 'u.username');
64
65
        $this->assertEquals($qb->getType(), QueryBuilder::SELECT);
66
    }
67
68
    public function testEmptySelectSetsType()
69
    {
70
        $qb = $this->_em->createQueryBuilder()
71
            ->delete('Doctrine\Tests\Models\CMS\CmsUser', 'u')
72
            ->select();
73
74
        $this->assertEquals($qb->getType(), QueryBuilder::SELECT);
75
    }
76
77
    public function testDeleteSetsType()
78
    {
79
        $qb = $this->_em->createQueryBuilder()
80
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
81
            ->delete();
82
83
        $this->assertEquals($qb->getType(), QueryBuilder::DELETE);
84
    }
85
86
    public function testUpdateSetsType()
87
    {
88
        $qb = $this->_em->createQueryBuilder()
89
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
90
            ->update();
91
92
        $this->assertEquals($qb->getType(), QueryBuilder::UPDATE);
93
    }
94
95
    public function testSimpleSelect()
96
    {
97
        $qb = $this->_em->createQueryBuilder()
98
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
99
            ->select('u.id', 'u.username');
100
101
        $this->assertValidQueryBuilder($qb, 'SELECT u.id, u.username FROM Doctrine\Tests\Models\CMS\CmsUser u');
102
    }
103
104
    public function testSimpleDelete()
105
    {
106
        $qb = $this->_em->createQueryBuilder()
107
            ->delete('Doctrine\Tests\Models\CMS\CmsUser', 'u');
108
109
        $this->assertValidQueryBuilder($qb, 'DELETE Doctrine\Tests\Models\CMS\CmsUser u');
110
    }
111
112
    public function testSimpleSelectWithFromIndexBy()
113
    {
114
        $qb = $this->_em->createQueryBuilder()
115
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u', 'u.id')
116
            ->select('u.id', 'u.username');
117
118
        $this->assertValidQueryBuilder($qb, 'SELECT u.id, u.username FROM Doctrine\Tests\Models\CMS\CmsUser u INDEX BY u.id');
119
    }
120
121
    public function testSimpleSelectWithIndexBy()
122
    {
123
        $qb = $this->_em->createQueryBuilder()
124
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
125
            ->indexBy('u', 'u.id')
126
            ->select('u.id', 'u.username');
127
128
        $this->assertValidQueryBuilder($qb, 'SELECT u.id, u.username FROM Doctrine\Tests\Models\CMS\CmsUser u INDEX BY u.id');
129
    }
130
131
    public function testSimpleUpdate()
132
    {
133
        $qb = $this->_em->createQueryBuilder()
134
            ->update('Doctrine\Tests\Models\CMS\CmsUser', 'u')
135
            ->set('u.username', ':username');
136
137
        $this->assertValidQueryBuilder($qb, 'UPDATE Doctrine\Tests\Models\CMS\CmsUser u SET u.username = :username');
138
    }
139
140
    public function testInnerJoin()
141
    {
142
        $qb = $this->_em->createQueryBuilder()
143
            ->select('u', 'a')
144
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
145
            ->innerJoin('u.articles', 'a');
146
147
        $this->assertValidQueryBuilder($qb, 'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles a');
148
    }
149
150
    public function testComplexInnerJoin()
151
    {
152
        $qb = $this->_em->createQueryBuilder()
153
            ->select('u', 'a')
154
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
155
            ->innerJoin('u.articles', 'a', 'ON', 'u.id = a.author_id');
156
157
        $this->assertValidQueryBuilder(
158
            $qb,
159
            'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles a ON u.id = a.author_id'
160
        );
161
    }
162
163
    public function testComplexInnerJoinWithIndexBy()
164
    {
165
        $qb = $this->_em->createQueryBuilder()
166
            ->select('u', 'a')
167
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
168
            ->innerJoin('u.articles', 'a', 'ON', 'u.id = a.author_id', 'a.name');
169
170
        $this->assertValidQueryBuilder(
171
            $qb,
172
            'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles a INDEX BY a.name ON u.id = a.author_id'
173
        );
174
    }
175
176
    public function testLeftJoin()
177
    {
178
        $qb = $this->_em->createQueryBuilder()
179
            ->select('u', 'a')
180
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
181
            ->leftJoin('u.articles', 'a');
182
183
        $this->assertValidQueryBuilder($qb, 'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a');
184
    }
185
186
    public function testLeftJoinWithIndexBy()
187
    {
188
        $qb = $this->_em->createQueryBuilder()
189
            ->select('u', 'a')
190
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
191
            ->leftJoin('u.articles', 'a', null, null, 'a.name');
192
193
        $this->assertValidQueryBuilder($qb, 'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a INDEX BY a.name');
194
    }
195
196
    public function testMultipleFrom()
197
    {
198
        $qb = $this->_em->createQueryBuilder()
199
            ->select('u', 'g')
200
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
201
            ->from('Doctrine\Tests\Models\CMS\CmsGroup', 'g');
202
203
        $this->assertValidQueryBuilder($qb, 'SELECT u, g FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsGroup g');
204
    }
205
206
    public function testMultipleFromWithIndexBy()
207
    {
208
        $qb = $this->_em->createQueryBuilder()
209
            ->select('u', 'g')
210
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
211
            ->from('Doctrine\Tests\Models\CMS\CmsGroup', 'g')
212
            ->indexBy('g', 'g.id');
213
214
        $this->assertValidQueryBuilder($qb, 'SELECT u, g FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsGroup g INDEX BY g.id');
215
    }
216
217
    public function testMultipleFromWithJoin()
218
    {
219
        $qb = $this->_em->createQueryBuilder()
220
            ->select('u', 'g')
221
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
222
            ->from('Doctrine\Tests\Models\CMS\CmsGroup', 'g')
223
            ->innerJoin('u.articles', 'a', 'ON', 'u.id = a.author_id');
224
225
        $this->assertValidQueryBuilder($qb, 'SELECT u, g FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles a ON u.id = a.author_id, Doctrine\Tests\Models\CMS\CmsGroup g');
226
    }
227
228
    public function testMultipleFromWithMultipleJoin()
229
    {
230
        $qb = $this->_em->createQueryBuilder()
231
            ->select('u', 'g')
232
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
233
            ->from('Doctrine\Tests\Models\CMS\CmsArticle', 'a')
234
            ->innerJoin('u.groups', 'g')
235
            ->leftJoin('u.address', 'ad')
236
            ->innerJoin('a.comments', 'c');
237
238
        $this->assertValidQueryBuilder($qb, 'SELECT u, g FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.groups g LEFT JOIN u.address ad, Doctrine\Tests\Models\CMS\CmsArticle a INNER JOIN a.comments c');
239
    }
240
241
    public function testWhere()
242
    {
243
        $qb = $this->_em->createQueryBuilder()
244
            ->select('u')
245
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
246
            ->where('u.id = :uid');
247
248
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid');
249
    }
250
251
    public function testComplexAndWhere()
252
    {
253
        $qb = $this->_em->createQueryBuilder()
254
            ->select('u')
255
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
256
            ->where('u.id = :uid OR u.id = :uid2 OR u.id = :uid3')
257
            ->andWhere('u.name = :name');
258
259
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE (u.id = :uid OR u.id = :uid2 OR u.id = :uid3) AND u.name = :name');
260
    }
261
262
    public function testAndWhere()
263
    {
264
        $qb = $this->_em->createQueryBuilder()
265
            ->select('u')
266
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
267
            ->where('u.id = :uid')
268
            ->andWhere('u.id = :uid2');
269
270
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid AND u.id = :uid2');
271
    }
272
273
    public function testOrWhere()
274
    {
275
        $qb = $this->_em->createQueryBuilder()
276
            ->select('u')
277
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
278
            ->where('u.id = :uid')
279
            ->orWhere('u.id = :uid2');
280
281
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid OR u.id = :uid2');
282
    }
283
284
    public function testComplexAndWhereOrWhereNesting()
285
    {
286
        $qb = $this->_em->createQueryBuilder();
287
        $qb->select('u')
288
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
289
           ->where('u.id = :uid')
290
           ->orWhere('u.id = :uid2')
291
           ->andWhere('u.id = :uid3')
292
           ->orWhere('u.name = :name1', 'u.name = :name2')
293
           ->andWhere('u.name <> :noname');
294
295
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE (((u.id = :uid OR u.id = :uid2) AND u.id = :uid3) OR u.name = :name1 OR u.name = :name2) AND u.name <> :noname');
296
    }
297
298
    public function testAndWhereIn()
299
    {
300
        $qb = $this->_em->createQueryBuilder();
301
        $qb->select('u')
302
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
303
           ->where('u.id = :uid')
304
           ->andWhere($qb->expr()->in('u.id', array(1, 2, 3)));
305
306
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid AND u.id IN(1, 2, 3)');
307
    }
308
309
    public function testOrWhereIn()
310
    {
311
        $qb = $this->_em->createQueryBuilder();
312
        $qb->select('u')
313
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
314
           ->where('u.id = :uid')
315
           ->orWhere($qb->expr()->in('u.id', array(1, 2, 3)));
316
317
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid OR u.id IN(1, 2, 3)');
318
    }
319
320
    public function testAndWhereNotIn()
321
    {
322
        $qb = $this->_em->createQueryBuilder();
323
        $qb->select('u')
324
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
325
           ->where('u.id = :uid')
326
           ->andWhere($qb->expr()->notIn('u.id', array(1, 2, 3)));
327
328
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid AND u.id NOT IN(1, 2, 3)');
329
    }
330
331
    public function testOrWhereNotIn()
332
    {
333
        $qb = $this->_em->createQueryBuilder();
334
        $qb->select('u')
335
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
336
           ->where('u.id = :uid')
337
           ->orWhere($qb->expr()->notIn('u.id', array(1, 2, 3)));
338
339
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid OR u.id NOT IN(1, 2, 3)');
340
    }
341
342
    public function testGroupBy()
343
    {
344
        $qb = $this->_em->createQueryBuilder()
345
            ->select('u')
346
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
347
            ->groupBy('u.id')
348
            ->addGroupBy('u.username');
349
350
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u GROUP BY u.id, u.username');
351
    }
352
353
    public function testHaving()
354
    {
355
        $qb = $this->_em->createQueryBuilder()
356
            ->select('u')
357
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
358
            ->groupBy('u.id')
359
            ->having('COUNT(u.id) > 1');
360
361
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u GROUP BY u.id HAVING COUNT(u.id) > 1');
362
    }
363
364
    public function testAndHaving()
365
    {
366
        $qb = $this->_em->createQueryBuilder()
367
            ->select('u')
368
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
369
            ->groupBy('u.id')
370
            ->having('COUNT(u.id) > 1')
371
            ->andHaving('COUNT(u.id) < 1');
372
373
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u GROUP BY u.id HAVING COUNT(u.id) > 1 AND COUNT(u.id) < 1');
374
    }
375
376
    public function testOrHaving()
377
    {
378
        $qb = $this->_em->createQueryBuilder()
379
            ->select('u')
380
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
381
            ->groupBy('u.id')
382
            ->having('COUNT(u.id) > 1')
383
            ->andHaving('COUNT(u.id) < 1')
384
            ->orHaving('COUNT(u.id) > 1');
385
386
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u GROUP BY u.id HAVING (COUNT(u.id) > 1 AND COUNT(u.id) < 1) OR COUNT(u.id) > 1');
387
    }
388
389
    public function testOrderBy()
390
    {
391
        $qb = $this->_em->createQueryBuilder()
392
            ->select('u')
393
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
394
            ->orderBy('u.username', 'ASC');
395
396
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.username ASC');
397
    }
398
399
    public function testOrderByWithExpression()
400
    {
401
        $qb = $this->_em->createQueryBuilder();
402
        $qb->select('u')
403
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
404
            ->orderBy($qb->expr()->asc('u.username'));
405
406
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.username ASC');
407
    }
408
409
    public function testAddOrderBy()
410
    {
411
        $qb = $this->_em->createQueryBuilder()
412
            ->select('u')
413
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
414
            ->orderBy('u.username', 'ASC')
415
            ->addOrderBy('u.username', 'DESC');
416
417
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.username ASC, u.username DESC');
418
    }
419
420
    public function testAddOrderByWithExpression()
421
    {
422
        $qb = $this->_em->createQueryBuilder();
423
        $qb->select('u')
424
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
425
            ->orderBy('u.username', 'ASC')
426
            ->addOrderBy($qb->expr()->desc('u.username'));
427
428
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u ORDER BY u.username ASC, u.username DESC');
429
    }
430
431
    public function testAddCriteriaWhere()
432
    {
433
        $qb = $this->_em->createQueryBuilder();
434
        $qb->select('u')
435
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
436
437
        $criteria = new Criteria();
438
        $criteria->where($criteria->expr()->eq('field', 'value'));
439
440
        $qb->addCriteria($criteria);
441
442
        $this->assertEquals('u.field = :field', (string) $qb->getDQLPart('where'));
443
        $this->assertNotNull($qb->getParameter('field'));
444
    }
445
446
    public function testAddMultipleSameCriteriaWhere()
447
    {
448
        $qb = $this->_em->createQueryBuilder();
449
        $qb->select('alias1')->from('Doctrine\Tests\Models\CMS\CmsUser', 'alias1');
450
451
        $criteria = new Criteria();
452
        $criteria->where($criteria->expr()->andX(
453
            $criteria->expr()->eq('field', 'value1'),
454
            $criteria->expr()->eq('field', 'value2')
455
        ));
456
457
        $qb->addCriteria($criteria);
458
459
        $this->assertEquals('alias1.field = :field AND alias1.field = :field_1', (string) $qb->getDQLPart('where'));
460
        $this->assertNotNull($qb->getParameter('field'));
461
        $this->assertNotNull($qb->getParameter('field_1'));
462
    }
463
464
    /**
465
     * @group DDC-2844
466
     */
467
    public function testAddCriteriaWhereWithMultipleParametersWithSameField()
468
    {
469
        $qb = $this->_em->createQueryBuilder();
470
        $qb->select('alias1')->from('Doctrine\Tests\Models\CMS\CmsUser', 'alias1');
471
472
        $criteria = new Criteria();
473
        $criteria->where($criteria->expr()->eq('field', 'value1'));
474
        $criteria->andWhere($criteria->expr()->gt('field', 'value2'));
475
476
        $qb->addCriteria($criteria);
477
478
        $this->assertEquals('alias1.field = :field AND alias1.field > :field_1', (string) $qb->getDQLPart('where'));
479
        $this->assertSame('value1', $qb->getParameter('field')->getValue());
480
        $this->assertSame('value2', $qb->getParameter('field_1')->getValue());
481
    }
482
483
    /**
484
     * @group DDC-2844
485
     */
486
    public function testAddCriteriaWhereWithMultipleParametersWithDifferentFields()
487
    {
488
        $qb = $this->_em->createQueryBuilder();
489
        $qb->select('alias1')->from('Doctrine\Tests\Models\CMS\CmsUser', 'alias1');
490
491
        $criteria = new Criteria();
492
        $criteria->where($criteria->expr()->eq('field1', 'value1'));
493
        $criteria->andWhere($criteria->expr()->gt('field2', 'value2'));
494
495
        $qb->addCriteria($criteria);
496
497
        $this->assertEquals('alias1.field1 = :field1 AND alias1.field2 > :field2', (string) $qb->getDQLPart('where'));
498
        $this->assertSame('value1', $qb->getParameter('field1')->getValue());
499
        $this->assertSame('value2', $qb->getParameter('field2')->getValue());
500
    }
501
502
    /**
503
     * @group DDC-2844
504
     */
505
    public function testAddCriteriaWhereWithMultipleParametersWithSubpathsAndDifferentProperties()
506
    {
507
        $qb = $this->_em->createQueryBuilder();
508
        $qb->select('alias1')->from('Doctrine\Tests\Models\CMS\CmsUser', 'alias1');
509
510
        $criteria = new Criteria();
511
        $criteria->where($criteria->expr()->eq('field1', 'value1'));
512
        $criteria->andWhere($criteria->expr()->gt('field2', 'value2'));
513
514
        $qb->addCriteria($criteria);
515
516
        $this->assertEquals('alias1.field1 = :field1 AND alias1.field2 > :field2', (string) $qb->getDQLPart('where'));
517
        $this->assertSame('value1', $qb->getParameter('field1')->getValue());
518
        $this->assertSame('value2', $qb->getParameter('field2')->getValue());
519
    }
520
521
    /**
522
     * @group DDC-2844
523
     */
524
    public function testAddCriteriaWhereWithMultipleParametersWithSubpathsAndSameProperty()
525
    {
526
        $qb = $this->_em->createQueryBuilder();
527
        $qb->select('alias1')->from('Doctrine\Tests\Models\CMS\CmsUser', 'alias1');
528
529
        $criteria = new Criteria();
530
        $criteria->where($criteria->expr()->eq('field1', 'value1'));
531
        $criteria->andWhere($criteria->expr()->gt('field1', 'value2'));
532
533
        $qb->addCriteria($criteria);
534
535
        $this->assertEquals('alias1.field1 = :field1 AND alias1.field1 > :field1_1', (string) $qb->getDQLPart('where'));
536
        $this->assertSame('value1', $qb->getParameter('field1')->getValue());
537
        $this->assertSame('value2', $qb->getParameter('field1_1')->getValue());
538
    }
539
540
    public function testAddCriteriaOrder()
541
    {
542
        $qb = $this->_em->createQueryBuilder();
543
        $qb->select('u')
544
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
545
546
        $criteria = new Criteria();
547
        $criteria->orderBy(array('field' => Criteria::DESC));
548
549
        $qb->addCriteria($criteria);
550
551
        $this->assertCount(1, $orderBy = $qb->getDQLPart('orderBy'));
552
        $this->assertEquals('u.field DESC', (string) $orderBy[0]);
553
    }
554
555
    /**
556
     * @group DDC-3108
557
     */
558
    public function testAddCriteriaOrderOnJoinAlias()
559
    {
560
        $qb = $this->_em->createQueryBuilder();
561
        $qb->select('u')
562
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
563
            ->join('u.article','a');
564
565
        $criteria = new Criteria();
566
        $criteria->orderBy(array('a.field' => Criteria::DESC));
567
568
        $qb->addCriteria($criteria);
569
570
        $this->assertCount(1, $orderBy = $qb->getDQLPart('orderBy'));
571
        $this->assertEquals('a.field DESC', (string) $orderBy[0]);
572
    }
573
574
    public function testAddCriteriaLimit()
575
    {
576
        $qb = $this->_em->createQueryBuilder();
577
        $qb->select('u')
578
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
579
580
        $criteria = new Criteria();
581
        $criteria->setFirstResult(2);
582
        $criteria->setMaxResults(10);
583
584
        $qb->addCriteria($criteria);
585
586
        $this->assertEquals(2, $qb->getFirstResult());
587
        $this->assertEquals(10, $qb->getMaxResults());
588
    }
589
590
    public function testAddCriteriaUndefinedLimit()
591
    {
592
        $qb = $this->_em->createQueryBuilder();
593
        $qb->select('u')
594
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
595
            ->setFirstResult(2)
596
            ->setMaxResults(10);
597
598
        $criteria = new Criteria();
599
600
        $qb->addCriteria($criteria);
601
602
        $this->assertEquals(2, $qb->getFirstResult());
603
        $this->assertEquals(10, $qb->getMaxResults());
604
    }
605
606
    public function testGetQuery()
607
    {
608
        $qb = $this->_em->createQueryBuilder()
609
            ->select('u')
610
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
611
        $q = $qb->getQuery();
612
613
        $this->assertEquals('Doctrine\ORM\Query', get_class($q));
614
    }
615
616
    public function testSetParameter()
617
    {
618
        $qb = $this->_em->createQueryBuilder()
619
            ->select('u')
620
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
621
            ->where('u.id = :id')
622
            ->setParameter('id', 1);
623
624
        $parameter = new Parameter('id', 1, ParameterTypeInferer::inferType(1));
625
626
        $this->assertEquals($parameter, $qb->getParameter('id'));
627
    }
628
629
    public function testSetParameters()
630
    {
631
        $qb = $this->_em->createQueryBuilder();
632
        $qb->select('u')
633
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
634
           ->where($qb->expr()->orx('u.username = :username', 'u.username = :username2'));
635
636
        $parameters = new ArrayCollection();
637
        $parameters->add(new Parameter('username', 'jwage'));
638
        $parameters->add(new Parameter('username2', 'jonwage'));
639
640
        $qb->setParameters($parameters);
641
642
        $this->assertEquals($parameters, $qb->getQuery()->getParameters());
643
    }
644
645
646
    public function testGetParameters()
647
    {
648
        $qb = $this->_em->createQueryBuilder();
649
        $qb->select('u')
650
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
651
           ->where('u.id = :id');
652
653
        $parameters = new ArrayCollection();
654
        $parameters->add(new Parameter('id', 1));
655
656
        $qb->setParameters($parameters);
657
658
        $this->assertEquals($parameters, $qb->getParameters());
659
    }
660
661
    public function testGetParameter()
662
    {
663
        $qb = $this->_em->createQueryBuilder()
664
            ->select('u')
665
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
666
            ->where('u.id = :id');
667
668
        $parameters = new ArrayCollection();
669
        $parameters->add(new Parameter('id', 1));
670
671
        $qb->setParameters($parameters);
672
673
        $this->assertEquals($parameters->first(), $qb->getParameter('id'));
674
    }
675
676
    public function testMultipleWhere()
677
    {
678
        $qb = $this->_em->createQueryBuilder()
679
            ->select('u')
680
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
681
            ->where('u.id = :uid', 'u.id = :uid2');
682
683
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid AND u.id = :uid2');
684
    }
685
686
    public function testMultipleAndWhere()
687
    {
688
        $qb = $this->_em->createQueryBuilder()
689
            ->select('u')
690
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
691
            ->andWhere('u.id = :uid', 'u.id = :uid2');
692
693
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid AND u.id = :uid2');
694
    }
695
696
    public function testMultipleOrWhere()
697
    {
698
        $qb = $this->_em->createQueryBuilder();
699
        $qb->select('u')
700
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
701
           ->orWhere('u.id = :uid', $qb->expr()->eq('u.id', ':uid2'));
702
703
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid OR u.id = :uid2');
704
    }
705
706
    public function testComplexWhere()
707
    {
708
        $qb = $this->_em->createQueryBuilder();
709
        $orExpr = $qb->expr()->orX();
710
        $orExpr->add($qb->expr()->eq('u.id', ':uid3'));
711
        $orExpr->add($qb->expr()->in('u.id', array(1)));
712
713
        $qb->select('u')
714
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
715
           ->where($orExpr);
716
717
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid3 OR u.id IN(1)');
718
    }
719
720
    public function testWhereInWithStringLiterals()
721
    {
722
        $qb = $this->_em->createQueryBuilder();
723
        $qb->select('u')
724
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
725
           ->where($qb->expr()->in('u.name', array('one', 'two', 'three')));
726
727
        $this->assertValidQueryBuilder($qb, "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name IN('one', 'two', 'three')");
728
729
        $qb->where($qb->expr()->in('u.name', array("O'Reilly", "O'Neil", 'Smith')));
730
731
        $this->assertValidQueryBuilder($qb, "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name IN('O''Reilly', 'O''Neil', 'Smith')");
732
    }
733
734
    public function testWhereInWithObjectLiterals()
735
    {
736
        $qb = $this->_em->createQueryBuilder();
737
        $expr = $this->_em->getExpressionBuilder();
738
        $qb->select('u')
739
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
740
           ->where($expr->in('u.name', array($expr->literal('one'), $expr->literal('two'), $expr->literal('three'))));
741
742
        $this->assertValidQueryBuilder($qb, "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name IN('one', 'two', 'three')");
743
744
        $qb->where($expr->in('u.name', array($expr->literal("O'Reilly"), $expr->literal("O'Neil"), $expr->literal('Smith'))));
745
746
        $this->assertValidQueryBuilder($qb, "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name IN('O''Reilly', 'O''Neil', 'Smith')");
747
    }
748
749
    public function testNegation()
750
    {
751
        $expr = $this->_em->getExpressionBuilder();
752
        $orExpr = $expr->orX();
753
        $orExpr->add($expr->eq('u.id', ':uid3'));
754
        $orExpr->add($expr->not($expr->in('u.id', array(1))));
755
756
        $qb = $this->_em->createQueryBuilder();
757
        $qb->select('u')
758
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
759
           ->where($orExpr);
760
761
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid3 OR NOT(u.id IN(1))');
762
    }
763
764
    public function testSomeAllAny()
765
    {
766
        $qb = $this->_em->createQueryBuilder();
767
        $expr = $this->_em->getExpressionBuilder();
768
769
        //$subquery = $qb->subquery('Doctrine\Tests\Models\CMS\CmsArticle', 'a')->select('a.id');
770
771
        $qb->select('u')
772
           ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
773
           ->where($expr->gt('u.id', $expr->all('select a.id from Doctrine\Tests\Models\CMS\CmsArticle a')));
774
775
        $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id > ALL(select a.id from Doctrine\Tests\Models\CMS\CmsArticle a)');
776
777
    }
778
779
    public function testMultipleIsolatedQueryConstruction()
780
    {
781
        $qb = $this->_em->createQueryBuilder();
782
        $expr = $this->_em->getExpressionBuilder();
783
784
        $qb->select('u')->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
785
        $qb->where($expr->eq('u.name', ':name'));
786
        $qb->setParameter('name', 'romanb');
787
788
        $q1 = $qb->getQuery();
789
790
        $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name = :name', $q1->getDql());
791
        $this->assertEquals(1, count($q1->getParameters()));
792
793
        // add another condition and construct a second query
794
        $qb->andWhere($expr->eq('u.id', ':id'));
795
        $qb->setParameter('id', 42);
796
797
        $q2 = $qb->getQuery();
798
799
        $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name = :name AND u.id = :id', $q2->getDql());
800
        $this->assertTrue($q1 !== $q2); // two different, independent queries
801
        $this->assertEquals(2, count($q2->getParameters()));
802
        $this->assertEquals(1, count($q1->getParameters())); // $q1 unaffected
803
    }
804
805
    public function testGetEntityManager()
806
    {
807
        $qb = $this->_em->createQueryBuilder();
808
        $this->assertEquals($this->_em, $qb->getEntityManager());
809
    }
810
811
    public function testInitialStateIsClean()
812
    {
813
        $qb = $this->_em->createQueryBuilder();
814
        $this->assertEquals(QueryBuilder::STATE_CLEAN, $qb->getState());
815
    }
816
817
    public function testAlteringQueryChangesStateToDirty()
818
    {
819
        $qb = $this->_em->createQueryBuilder()
820
            ->select('u')
821
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
822
823
        $this->assertEquals(QueryBuilder::STATE_DIRTY, $qb->getState());
824
    }
825
826
    public function testSelectWithFuncExpression()
827
    {
828
        $qb = $this->_em->createQueryBuilder();
829
        $expr = $qb->expr();
830
        $qb->select($expr->count('e.id'));
831
832
        $this->assertValidQueryBuilder($qb, 'SELECT COUNT(e.id)');
833
    }
834
835
    public function testResetDQLPart()
836
    {
837
        $qb = $this->_em->createQueryBuilder()
838
            ->select('u')
839
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
840
            ->where('u.username = ?1')->orderBy('u.username');
841
842
        $this->assertEquals('u.username = ?1', (string)$qb->getDQLPart('where'));
843
        $this->assertEquals(1, count($qb->getDQLPart('orderBy')));
844
845
        $qb->resetDqlPart('where')->resetDqlPart('orderBy');
846
847
        $this->assertNull($qb->getDQLPart('where'));
848
        $this->assertEquals(0, count($qb->getDQLPart('orderBy')));
849
    }
850
851
    public function testResetDQLParts()
852
    {
853
        $qb = $this->_em->createQueryBuilder()
854
            ->select('u')
855
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
856
            ->where('u.username = ?1')->orderBy('u.username');
857
858
        $qb->resetDQLParts(array('where', 'orderBy'));
859
860
        $this->assertEquals(1, count($qb->getDQLPart('select')));
861
        $this->assertNull($qb->getDQLPart('where'));
862
        $this->assertEquals(0, count($qb->getDQLPart('orderBy')));
863
    }
864
865
    public function testResetAllDQLParts()
866
    {
867
        $qb = $this->_em->createQueryBuilder()
868
            ->select('u')
869
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
870
            ->where('u.username = ?1')->orderBy('u.username');
871
872
        $qb->resetDQLParts();
873
874
        $this->assertEquals(0, count($qb->getDQLPart('select')));
875
        $this->assertNull($qb->getDQLPart('where'));
876
        $this->assertEquals(0, count($qb->getDQLPart('orderBy')));
877
    }
878
879
    /**
880
     * @group DDC-867
881
     */
882
    public function testDeepClone()
883
    {
884
        $qb = $this->_em->createQueryBuilder()
885
            ->select('u')
886
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
887
            ->andWhere('u.username = ?1')
888
            ->andWhere('u.status = ?2');
889
890
        $expr = $qb->getDQLPart('where');
891
        $this->assertEquals(2, $expr->count(), "Modifying the second query should affect the first one.");
892
893
        $qb2 = clone $qb;
894
        $qb2->andWhere('u.name = ?3');
895
896
        $this->assertEquals(2, $expr->count(), "Modifying the second query should affect the first one.");
897
    }
898
899
    /**
900
     * @group DDC-3108
901
     */
902
    public function testAddCriteriaWhereWithJoinAlias()
903
    {
904
        $qb = $this->_em->createQueryBuilder();
905
        $qb->select('alias1')->from('Doctrine\Tests\Models\CMS\CmsUser', 'alias1');
906
        $qb->join('alias1.articles','alias2');
907
908
        $criteria = new Criteria();
909
        $criteria->where($criteria->expr()->eq('field', 'value1'));
910
        $criteria->andWhere($criteria->expr()->gt('alias2.field', 'value2'));
911
912
        $qb->addCriteria($criteria);
913
914
        $this->assertEquals('alias1.field = :field AND alias2.field > :alias2_field', (string) $qb->getDQLPart('where'));
915
        $this->assertSame('value1', $qb->getParameter('field')->getValue());
916
        $this->assertSame('value2', $qb->getParameter('alias2_field')->getValue());
917
    }
918
919
    /**
920
     * @group DDC-3108
921
     */
922
    public function testAddCriteriaWhereWithDefaultAndJoinAlias()
923
    {
924
        $qb = $this->_em->createQueryBuilder();
925
        $qb->select('alias1')->from('Doctrine\Tests\Models\CMS\CmsUser', 'alias1');
926
        $qb->join('alias1.articles','alias2');
927
928
        $criteria = new Criteria();
929
        $criteria->where($criteria->expr()->eq('alias1.field', 'value1'));
930
        $criteria->andWhere($criteria->expr()->gt('alias2.field', 'value2'));
931
932
        $qb->addCriteria($criteria);
933
934
        $this->assertEquals('alias1.field = :alias1_field AND alias2.field > :alias2_field', (string) $qb->getDQLPart('where'));
935
        $this->assertSame('value1', $qb->getParameter('alias1_field')->getValue());
936
        $this->assertSame('value2', $qb->getParameter('alias2_field')->getValue());
937
    }
938
939
    /**
940
     * @group DDC-3108
941
     */
942
    public function testAddCriteriaWhereOnJoinAliasWithDuplicateFields()
943
    {
944
        $qb = $this->_em->createQueryBuilder();
945
        $qb->select('alias1')->from('Doctrine\Tests\Models\CMS\CmsUser', 'alias1');
946
        $qb->join('alias1.articles','alias2');
947
948
        $criteria = new Criteria();
949
        $criteria->where($criteria->expr()->eq('alias1.field', 'value1'));
950
        $criteria->andWhere($criteria->expr()->gt('alias2.field', 'value2'));
951
        $criteria->andWhere($criteria->expr()->lt('alias2.field', 'value3'));
952
953
        $qb->addCriteria($criteria);
954
955
        $this->assertEquals('(alias1.field = :alias1_field AND alias2.field > :alias2_field) AND alias2.field < :alias2_field_2', (string) $qb->getDQLPart('where'));
956
        $this->assertSame('value1', $qb->getParameter('alias1_field')->getValue());
957
        $this->assertSame('value2', $qb->getParameter('alias2_field')->getValue());
958
        $this->assertSame('value3', $qb->getParameter('alias2_field_2')->getValue());
959
    }
960
961
962
    /**
963
     * @group DDC-1933
964
     */
965
    public function testParametersAreCloned()
966
    {
967
        $originalQb = new QueryBuilder($this->_em);
968
969
        $originalQb->setParameter('parameter1', 'value1');
970
971
        $copy = clone $originalQb;
972
        $copy->setParameter('parameter2', 'value2');
973
974
        $this->assertCount(1, $originalQb->getParameters());
975
        $this->assertSame('value1', $copy->getParameter('parameter1')->getValue());
976
        $this->assertSame('value2', $copy->getParameter('parameter2')->getValue());
977
    }
978
979
    public function testGetRootAlias()
980
    {
981
        $qb = $this->_em->createQueryBuilder()
982
            ->select('u')
983
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
984
985
        $this->assertEquals('u', $qb->getRootAlias());
0 ignored issues
show
Deprecated Code introduced by
The method Doctrine\ORM\QueryBuilder::getRootAlias() has been deprecated with message: Please use $qb->getRootAliases() instead.

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
986
    }
987
988
    public function testGetRootAliases()
989
    {
990
        $qb = $this->_em->createQueryBuilder()
991
            ->select('u')
992
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
993
994
        $this->assertEquals(array('u'), $qb->getRootAliases());
995
    }
996
997
    public function testGetRootEntities()
998
    {
999
        $qb = $this->_em->createQueryBuilder()
1000
            ->select('u')
1001
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
1002
1003
        $this->assertEquals(array('Doctrine\Tests\Models\CMS\CmsUser'), $qb->getRootEntities());
1004
    }
1005
1006
    public function testGetSeveralRootAliases()
1007
    {
1008
        $qb = $this->_em->createQueryBuilder()
1009
            ->select('u')
1010
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
1011
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u2');
1012
1013
        $this->assertEquals(array('u', 'u2'), $qb->getRootAliases());
1014
        $this->assertEquals('u', $qb->getRootAlias());
0 ignored issues
show
Deprecated Code introduced by
The method Doctrine\ORM\QueryBuilder::getRootAlias() has been deprecated with message: Please use $qb->getRootAliases() instead.

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
1015
    }
1016
1017
    public function testBCAddJoinWithoutRootAlias()
1018
    {
1019
        $qb = $this->_em->createQueryBuilder()
1020
            ->select('u')
1021
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
1022
            ->add('join', array('INNER JOIN u.groups g'), true);
1023
1024
        $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.groups g', $qb->getDQL());
1025
    }
1026
1027
    /**
1028
     * @group DDC-1211
1029
     */
1030
    public function testEmptyStringLiteral()
1031
    {
1032
        $expr = $this->_em->getExpressionBuilder();
1033
        $qb = $this->_em->createQueryBuilder()
1034
            ->select('u')
1035
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
1036
            ->where($expr->eq('u.username', $expr->literal("")));
1037
1038
        $this->assertEquals("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username = ''", $qb->getDQL());
1039
    }
1040
1041
    /**
1042
     * @group DDC-1211
1043
     */
1044
    public function testEmptyNumericLiteral()
1045
    {
1046
        $expr = $this->_em->getExpressionBuilder();
1047
        $qb = $this->_em->createQueryBuilder()
1048
            ->select('u')
1049
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
1050
            ->where($expr->eq('u.username', $expr->literal(0)));
1051
1052
        $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username = 0', $qb->getDQL());
1053
    }
1054
1055
    /**
1056
     * @group DDC-1227
1057
     */
1058
    public function testAddFromString()
1059
    {
1060
        $qb = $this->_em->createQueryBuilder()
1061
            ->add('select', 'u')
0 ignored issues
show
Documentation introduced by
'u' is of type string, but the function expects a object|array.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
1062
            ->add('from', 'Doctrine\Tests\Models\CMS\CmsUser u');
0 ignored issues
show
Documentation introduced by
'Doctrine\\Tests\\Models\\CMS\\CmsUser u' is of type string, but the function expects a object|array.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
1063
1064
        $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u', $qb->getDQL());
1065
    }
1066
1067
    /**
1068
     * @group DDC-1619
1069
     */
1070
    public function testAddDistinct()
1071
    {
1072
        $qb = $this->_em->createQueryBuilder()
1073
            ->select('u')
1074
            ->distinct()
1075
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
1076
1077
        $this->assertEquals('SELECT DISTINCT u FROM Doctrine\Tests\Models\CMS\CmsUser u', $qb->getDQL());
1078
    }
1079
1080
    /**
1081
     * @group DDC-2192
1082
     */
1083
    public function testWhereAppend()
1084
    {
1085
        $this->setExpectedException('InvalidArgumentException', "Using \$append = true does not have an effect with 'where' or 'having' parts. See QueryBuilder#andWhere() for an example for correct usage.");
1086
1087
        $qb = $this->_em->createQueryBuilder()
0 ignored issues
show
Unused Code introduced by
$qb is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1088
            ->add('where', 'u.foo = ?1')
0 ignored issues
show
Documentation introduced by
'u.foo = ?1' is of type string, but the function expects a object|array.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
1089
            ->add('where', 'u.bar = ?2', true)
0 ignored issues
show
Documentation introduced by
'u.bar = ?2' is of type string, but the function expects a object|array.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
1090
        ;
1091
    }
1092
1093
    public function testSecondLevelCacheQueryBuilderOptions()
1094
    {
1095
        $defaultQueryBuilder = $this->_em->createQueryBuilder()
1096
            ->select('s')
1097
            ->from('Doctrine\Tests\Models\Cache\State', 's');
1098
1099
        $this->assertFalse($defaultQueryBuilder->isCacheable());
1100
        $this->assertEquals(0, $defaultQueryBuilder->getLifetime());
1101
        $this->assertNull($defaultQueryBuilder->getCacheRegion());
1102
        $this->assertNull($defaultQueryBuilder->getCacheMode());
1103
1104
        $defaultQuery = $defaultQueryBuilder->getQuery();
1105
1106
        $this->assertFalse($defaultQuery->isCacheable());
1107
        $this->assertEquals(0, $defaultQuery->getLifetime());
1108
        $this->assertNull($defaultQuery->getCacheRegion());
1109
        $this->assertNull($defaultQuery->getCacheMode());
1110
1111
        $builder = $this->_em->createQueryBuilder()
1112
            ->select('s')
1113
            ->setLifetime(123)
1114
            ->setCacheable(true)
1115
            ->setCacheRegion('foo_reg')
1116
            ->setCacheMode(Cache::MODE_REFRESH)
1117
            ->from('Doctrine\Tests\Models\Cache\State', 's');
1118
1119
        $this->assertTrue($builder->isCacheable());
1120
        $this->assertEquals(123, $builder->getLifetime());
1121
        $this->assertEquals('foo_reg', $builder->getCacheRegion());
1122
        $this->assertEquals(Cache::MODE_REFRESH, $builder->getCacheMode());
1123
1124
        $query = $builder->getQuery();
1125
1126
        $this->assertTrue($query->isCacheable());
1127
        $this->assertEquals(123, $query->getLifetime());
1128
        $this->assertEquals('foo_reg', $query->getCacheRegion());
1129
        $this->assertEquals(Cache::MODE_REFRESH, $query->getCacheMode());
1130
    }
1131
1132
    /**
1133
     * @group DDC-2253
1134
     */
1135
    public function testRebuildsFromParts()
1136
    {
1137
        $qb = $this->_em->createQueryBuilder()
1138
          ->select('u')
1139
          ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
1140
          ->join('u.article', 'a');
1141
1142
        $dqlParts = $qb->getDQLParts();
1143
        $dql = $qb->getDQL();
1144
1145
        $qb2 = $this->_em->createQueryBuilder();
1146
        foreach (array_filter($dqlParts) as $name => $part) {
1147
            $qb2->add($name, $part);
1148
        }
1149
        $dql2 = $qb2->getDQL();
1150
1151
        $this->assertEquals($dql, $dql2);
1152
    }
1153
1154
    public function testGetAllAliasesWithNoJoins()
1155
    {
1156
        $qb = $this->_em->createQueryBuilder();
1157
        $qb->select('u')->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
1158
1159
        $aliases = $qb->getAllAliases();
1160
1161
        $this->assertEquals(['u'], $aliases);
1162
    }
1163
1164
    public function testGetAllAliasesWithJoins()
1165
    {
1166
        $qb = $this->_em->createQueryBuilder()
1167
            ->select('u')
1168
            ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u')
1169
            ->join('u.groups', 'g');
1170
1171
        $aliases = $qb->getAllAliases();
1172
1173
        $this->assertEquals(['u', 'g'], $aliases);
1174
    }
1175
}
1176