@@ -45,7 +45,36 @@ public static function provideQueryBuilderToMql(): iterable
45
45
*/
46
46
$ date = new DateTimeImmutable ('2016-07-12 15:30:00 ' );
47
47
48
- yield 'find ' => [
48
+ yield 'select replaces previous select ' => [
49
+ ['find ' => [[], ['projection ' => ['bar ' => 1 ]]]],
50
+ fn (Builder $ builder ) => $ builder ->select ('foo ' )->select ('bar ' ),
51
+ ];
52
+
53
+ yield 'select array ' => [
54
+ ['find ' => [[], ['projection ' => ['foo ' => 1 , 'bar ' => 1 ]]]],
55
+ fn (Builder $ builder ) => $ builder ->select (['foo ' , 'bar ' ]),
56
+ ];
57
+
58
+ /** @see DatabaseQueryBuilderTest::testAddingSelects */
59
+ yield 'addSelect ' => [
60
+ ['find ' => [[], ['projection ' => ['foo ' => 1 , 'bar ' => 1 , 'baz ' => 1 , 'boom ' => 1 ]]]],
61
+ fn (Builder $ builder ) => $ builder ->select ('foo ' )
62
+ ->addSelect ('bar ' )
63
+ ->addSelect (['baz ' , 'boom ' ])
64
+ ->addSelect ('bar ' ),
65
+ ];
66
+
67
+ yield 'select all ' => [
68
+ ['find ' => [[], []]],
69
+ fn (Builder $ builder ) => $ builder ->select ('* ' ),
70
+ ];
71
+
72
+ yield 'find all with select ' => [
73
+ ['find ' => [[], ['projection ' => ['foo ' => 1 , 'bar ' => 1 ]]]],
74
+ fn (Builder $ builder ) => $ builder ->select ('foo ' , 'bar ' ),
75
+ ];
76
+
77
+ yield 'find equals ' => [
49
78
['find ' => [['foo ' => 'bar ' ], []]],
50
79
fn (Builder $ builder ) => $ builder ->where ('foo ' , 'bar ' ),
51
80
];
@@ -66,11 +95,55 @@ public static function provideQueryBuilderToMql(): iterable
66
95
fn (Builder $ builder ) => $ builder ->where ('foo ' , '> ' , $ date ),
67
96
];
68
97
69
- yield 'find in array ' => [
98
+ /** @see DatabaseQueryBuilderTest::testBasicWhereIns */
99
+ yield 'whereIn ' => [
70
100
['find ' => [['foo ' => ['$in ' => ['bar ' , 'baz ' ]]], []]],
71
101
fn (Builder $ builder ) => $ builder ->whereIn ('foo ' , ['bar ' , 'baz ' ]),
72
102
];
73
103
104
+ // Nested array are not flattened like in the Eloquent builder. MongoDB can compare objects.
105
+ $ array = [['issue ' => 45582 ], ['id ' => 2 ], [3 ]];
106
+ yield 'whereIn nested array ' => [
107
+ ['find ' => [['id ' => ['$in ' => $ array ]], []]],
108
+ fn (Builder $ builder ) => $ builder ->whereIn ('id ' , $ array ),
109
+ ];
110
+
111
+ yield 'orWhereIn ' => [
112
+ ['find ' => [
113
+ ['$or ' => [
114
+ ['id ' => 1 ],
115
+ ['id ' => ['$in ' => [1 , 2 , 3 ]]],
116
+ ]],
117
+ [], // options
118
+ ]],
119
+ fn (Builder $ builder ) => $ builder ->where ('id ' , '= ' , 1 )
120
+ ->orWhereIn ('id ' , [1 , 2 , 3 ]),
121
+ ];
122
+
123
+ /** @see DatabaseQueryBuilderTest::testBasicWhereNotIns */
124
+ yield 'whereNotIn ' => [
125
+ ['find ' => [['id ' => ['$nin ' => [1 , 2 , 3 ]]], []]],
126
+ fn (Builder $ builder ) => $ builder ->whereNotIn ('id ' , [1 , 2 , 3 ]),
127
+ ];
128
+
129
+ yield 'orWhereNotIn ' => [
130
+ ['find ' => [
131
+ ['$or ' => [
132
+ ['id ' => 1 ],
133
+ ['id ' => ['$nin ' => [1 , 2 , 3 ]]],
134
+ ]],
135
+ [], // options
136
+ ]],
137
+ fn (Builder $ builder ) => $ builder ->where ('id ' , '= ' , 1 )
138
+ ->orWhereNotIn ('id ' , [1 , 2 , 3 ]),
139
+ ];
140
+
141
+ /** @see DatabaseQueryBuilderTest::testEmptyWhereIns */
142
+ yield 'whereIn empty array ' => [
143
+ ['find ' => [['id ' => ['$in ' => []]], []]],
144
+ fn (Builder $ builder ) => $ builder ->whereIn ('id ' , []),
145
+ ];
146
+
74
147
yield 'find limit offset select ' => [
75
148
['find ' => [[], ['limit ' => 10 , 'skip ' => 5 , 'projection ' => ['foo ' => 1 , 'bar ' => 1 ]]]],
76
149
fn (Builder $ builder ) => $ builder ->limit (10 )->offset (5 )->select ('foo ' , 'bar ' ),
@@ -266,6 +339,43 @@ public static function provideQueryBuilderToMql(): iterable
266
339
fn (Builder $ builder ) => $ builder ->forPage (3 , 20 ),
267
340
];
268
341
342
+ /** @see DatabaseQueryBuilderTest::testLimitsAndOffsets() */
343
+ yield 'offset limit ' => [
344
+ ['find ' => [[], ['skip ' => 5 , 'limit ' => 10 ]]],
345
+ fn (Builder $ builder ) => $ builder ->offset (5 )->limit (10 ),
346
+ ];
347
+
348
+ yield 'offset limit zero (unset) ' => [
349
+ ['find ' => [[], []]],
350
+ fn (Builder $ builder ) => $ builder
351
+ ->offset (0 )->limit (0 ),
352
+ ];
353
+
354
+ yield 'offset limit zero (reset) ' => [
355
+ ['find ' => [[], []]],
356
+ fn (Builder $ builder ) => $ builder
357
+ ->offset (5 )->limit (10 )
358
+ ->offset (0 )->limit (0 ),
359
+ ];
360
+
361
+ yield 'offset limit negative (unset) ' => [
362
+ ['find ' => [[], []]],
363
+ fn (Builder $ builder ) => $ builder
364
+ ->offset (-5 )->limit (-10 ),
365
+ ];
366
+
367
+ yield 'offset limit null (reset) ' => [
368
+ ['find ' => [[], []]],
369
+ fn (Builder $ builder ) => $ builder
370
+ ->offset (5 )->limit (10 )
371
+ ->offset (null )->limit (null ),
372
+ ];
373
+
374
+ yield 'skip take (aliases) ' => [
375
+ ['find ' => [[], ['skip ' => 5 , 'limit ' => 10 ]]],
376
+ fn (Builder $ builder ) => $ builder ->skip (5 )->limit (10 ),
377
+ ];
378
+
269
379
/** @see DatabaseQueryBuilderTest::testOrderBys() */
270
380
yield 'orderBy multiple columns ' => [
271
381
['find ' => [[], ['sort ' => ['email ' => 1 , 'age ' => -1 ]]]],
@@ -452,11 +562,57 @@ function (Builder $builder) {
452
562
->orWhereNotBetween ('id ' , collect ([3 , 4 ])),
453
563
];
454
564
565
+ /** @see DatabaseQueryBuilderTest::testBasicSelectDistinct */
455
566
yield 'distinct ' => [
456
567
['distinct ' => ['foo ' , [], []]],
457
568
fn (Builder $ builder ) => $ builder ->distinct ('foo ' ),
458
569
];
459
570
571
+ yield 'select distinct ' => [
572
+ ['distinct ' => ['foo ' , [], []]],
573
+ fn (Builder $ builder ) => $ builder ->select ('foo ' , 'bar ' )
574
+ ->distinct (),
575
+ ];
576
+
577
+ /** @see DatabaseQueryBuilderTest::testBasicSelectDistinctOnColumns */
578
+ yield 'select distinct on ' => [
579
+ ['distinct ' => ['foo ' , [], []]],
580
+ fn (Builder $ builder ) => $ builder ->distinct ('foo ' )
581
+ ->select ('foo ' , 'bar ' ),
582
+ ];
583
+
584
+ /** @see DatabaseQueryBuilderTest::testLatest() */
585
+ yield 'latest ' => [
586
+ ['find ' => [[], ['sort ' => ['created_at ' => -1 ]]]],
587
+ fn (Builder $ builder ) => $ builder ->latest (),
588
+ ];
589
+
590
+ yield 'latest limit ' => [
591
+ ['find ' => [[], ['sort ' => ['created_at ' => -1 ], 'limit ' => 1 ]]],
592
+ fn (Builder $ builder ) => $ builder ->latest ()->limit (1 ),
593
+ ];
594
+
595
+ yield 'latest custom field ' => [
596
+ ['find ' => [[], ['sort ' => ['updated_at ' => -1 ]]]],
597
+ fn (Builder $ builder ) => $ builder ->latest ('updated_at ' ),
598
+ ];
599
+
600
+ /** @see DatabaseQueryBuilderTest::testOldest() */
601
+ yield 'oldest ' => [
602
+ ['find ' => [[], ['sort ' => ['created_at ' => 1 ]]]],
603
+ fn (Builder $ builder ) => $ builder ->oldest (),
604
+ ];
605
+
606
+ yield 'oldest limit ' => [
607
+ ['find ' => [[], ['sort ' => ['created_at ' => 1 ], 'limit ' => 1 ]]],
608
+ fn (Builder $ builder ) => $ builder ->oldest ()->limit (1 ),
609
+ ];
610
+
611
+ yield 'oldest custom field ' => [
612
+ ['find ' => [[], ['sort ' => ['updated_at ' => 1 ]]]],
613
+ fn (Builder $ builder ) => $ builder ->oldest ('updated_at ' ),
614
+ ];
615
+
460
616
yield 'groupBy ' => [
461
617
['aggregate ' => [
462
618
[['$group ' => ['_id ' => ['foo ' => '$foo ' ], 'foo ' => ['$last ' => '$foo ' ]]]],
@@ -516,6 +672,12 @@ public static function provideExceptions(): iterable
516
672
'Between $values must be a list with exactly two elements: [min, max] ' ,
517
673
fn (Builder $ builder ) => $ builder ->whereBetween ('id ' , ['min ' => 1 , 'max ' => 2 ]),
518
674
];
675
+
676
+ yield 'find with single string argument ' => [
677
+ \ArgumentCountError::class,
678
+ 'Too few arguments to function Jenssegers\Mongodb\Query\Builder::where("foo"), 1 passed and at least 2 expected when the 1st is a string ' ,
679
+ fn (Builder $ builder ) => $ builder ->where ('foo ' ),
680
+ ];
519
681
}
520
682
521
683
/** @dataProvider getEloquentMethodsNotSupported */
@@ -562,6 +724,18 @@ public static function getEloquentMethodsNotSupported()
562
724
yield 'having ' => [fn (Builder $ builder ) => $ builder ->having ('baz ' , '= ' , 1 )];
563
725
yield 'havingBetween ' => [fn (Builder $ builder ) => $ builder ->havingBetween ('last_login_date ' , ['2018-11-16 ' , '2018-12-16 ' ])];
564
726
yield 'orHavingRaw ' => [fn (Builder $ builder ) => $ builder ->orHavingRaw ('user_foo < user_bar ' )];
727
+
728
+ /** @see DatabaseQueryBuilderTest::testWhereIntegerInRaw */
729
+ yield 'whereIntegerInRaw ' => [fn (Builder $ builder ) => $ builder ->whereIntegerInRaw ('id ' , ['1a ' , 2 ])];
730
+
731
+ /** @see DatabaseQueryBuilderTest::testOrWhereIntegerInRaw */
732
+ yield 'orWhereIntegerInRaw ' => [fn (Builder $ builder ) => $ builder ->orWhereIntegerInRaw ('id ' , ['1a ' , 2 ])];
733
+
734
+ /** @see DatabaseQueryBuilderTest::testWhereIntegerNotInRaw */
735
+ yield 'whereIntegerNotInRaw ' => [fn (Builder $ builder ) => $ builder ->whereIntegerNotInRaw ('id ' , ['1a ' , 2 ])];
736
+
737
+ /** @see DatabaseQueryBuilderTest::testOrWhereIntegerNotInRaw */
738
+ yield 'orWhereIntegerNotInRaw ' => [fn (Builder $ builder ) => $ builder ->orWhereIntegerNotInRaw ('id ' , ['1a ' , 2 ])];
565
739
}
566
740
567
741
private static function getBuilder (): Builder
0 commit comments