QueryTest.php 11.5 KB
Newer Older
Jens Segers's avatar
Jens Segers committed
1
<?php
Simon Schaufelberger's avatar
Simon Schaufelberger committed
2
declare(strict_types=1);
Jens Segers's avatar
Jens Segers committed
3

Jens Segers's avatar
Jens Segers committed
4 5
class QueryTest extends TestCase
{
Jens Segers's avatar
Jens Segers committed
6
    protected static $started = false;
7

Stas's avatar
Stas committed
8
    public function setUp(): void
Jens Segers's avatar
Jens Segers committed
9 10 11 12 13 14 15 16 17 18 19 20 21
    {
        parent::setUp();
        User::create(['name' => 'John Doe', 'age' => 35, 'title' => 'admin']);
        User::create(['name' => 'Jane Doe', 'age' => 33, 'title' => 'admin']);
        User::create(['name' => 'Harry Hoe', 'age' => 13, 'title' => 'user']);
        User::create(['name' => 'Robert Roe', 'age' => 37, 'title' => 'user']);
        User::create(['name' => 'Mark Moe', 'age' => 23, 'title' => 'user']);
        User::create(['name' => 'Brett Boe', 'age' => 35, 'title' => 'user']);
        User::create(['name' => 'Tommy Toe', 'age' => 33, 'title' => 'user']);
        User::create(['name' => 'Yvonne Yoe', 'age' => 35, 'title' => 'admin']);
        User::create(['name' => 'Error', 'age' => null, 'title' => null]);
    }

Stas's avatar
Stas committed
22
    public function tearDown(): void
Jens Segers's avatar
Jens Segers committed
23 24
    {
        User::truncate();
25
        Scoped::truncate();
Jens Segers's avatar
Jens Segers committed
26 27 28
        parent::tearDown();
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
29
    public function testWhere(): void
Jens Segers's avatar
Jens Segers committed
30 31
    {
        $users = User::where('age', 35)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
32
        $this->assertCount(3, $users);
33

Jens Segers's avatar
Jens Segers committed
34
        $users = User::where('age', '=', 35)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
35
        $this->assertCount(3, $users);
Jens Segers's avatar
Jens Segers committed
36 37

        $users = User::where('age', '>=', 35)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
38
        $this->assertCount(4, $users);
Jens Segers's avatar
Jens Segers committed
39 40

        $users = User::where('age', '<=', 18)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
41
        $this->assertCount(1, $users);
Jens Segers's avatar
Jens Segers committed
42 43

        $users = User::where('age', '!=', 35)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
44
        $this->assertCount(6, $users);
Jens Segers's avatar
Jens Segers committed
45 46

        $users = User::where('age', '<>', 35)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
47
        $this->assertCount(6, $users);
Jens Segers's avatar
Jens Segers committed
48 49
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
50
    public function testAndWhere(): void
Jens Segers's avatar
Jens Segers committed
51 52
    {
        $users = User::where('age', 35)->where('title', 'admin')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
53
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
54 55

        $users = User::where('age', '>=', 35)->where('title', 'user')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
56
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
57 58
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
59
    public function testLike(): void
Jens Segers's avatar
Jens Segers committed
60 61
    {
        $users = User::where('name', 'like', '%doe')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
62
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
63 64

        $users = User::where('name', 'like', '%y%')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
65
        $this->assertCount(3, $users);
Jens Segers's avatar
Jens Segers committed
66 67

        $users = User::where('name', 'LIKE', '%y%')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
68
        $this->assertCount(3, $users);
Jens Segers's avatar
Jens Segers committed
69 70

        $users = User::where('name', 'like', 't%')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
71
        $this->assertCount(1, $users);
72 73 74 75 76 77 78 79 80

        $users = User::where('age', 'like', '%35%')->get();
        $this->assertCount(3, $users);

        $users = User::where('age', 'like', '3%')->get();
        $this->assertCount(6, $users);

        $users = User::where('age', 'like', '%3')->get();
        $this->assertCount(4, $users);
Jens Segers's avatar
Jens Segers committed
81 82
    }

83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
    public function testNotLike(): void
    {
        $users = User::where('name', 'not like', '%doe')->get();
        $this->assertCount(7, $users);

        $users = User::where('name', 'not like', '%y%')->get();
        $this->assertCount(6, $users);

        $users = User::where('name', 'not LIKE', '%y%')->get();
        $this->assertCount(6, $users);

        $users = User::where('name', 'not like', 't%')->get();
        $this->assertCount(8, $users);
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
98
    public function testSelect(): void
Jens Segers's avatar
Jens Segers committed
99 100 101 102
    {
        $user = User::where('name', 'John Doe')->select('name')->first();

        $this->assertEquals('John Doe', $user->name);
Gabriel Caruso's avatar
Gabriel Caruso committed
103 104
        $this->assertNull($user->age);
        $this->assertNull($user->title);
Jens Segers's avatar
Jens Segers committed
105

Jens Segers's avatar
Jens Segers committed
106 107 108 109
        $user = User::where('name', 'John Doe')->select('name', 'title')->first();

        $this->assertEquals('John Doe', $user->name);
        $this->assertEquals('admin', $user->title);
Gabriel Caruso's avatar
Gabriel Caruso committed
110
        $this->assertNull($user->age);
Jens Segers's avatar
Jens Segers committed
111 112

        $user = User::where('name', 'John Doe')->select(['name', 'title'])->get()->first();
113

Jens Segers's avatar
Jens Segers committed
114 115
        $this->assertEquals('John Doe', $user->name);
        $this->assertEquals('admin', $user->title);
Gabriel Caruso's avatar
Gabriel Caruso committed
116
        $this->assertNull($user->age);
Jens Segers's avatar
Jens Segers committed
117 118 119 120

        $user = User::where('name', 'John Doe')->get(['name'])->first();

        $this->assertEquals('John Doe', $user->name);
Gabriel Caruso's avatar
Gabriel Caruso committed
121
        $this->assertNull($user->age);
Jens Segers's avatar
Jens Segers committed
122 123
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
124
    public function testOrWhere(): void
Jens Segers's avatar
Jens Segers committed
125 126
    {
        $users = User::where('age', 13)->orWhere('title', 'admin')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
127
        $this->assertCount(4, $users);
Jens Segers's avatar
Jens Segers committed
128 129

        $users = User::where('age', 13)->orWhere('age', 23)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
130
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
131 132
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
133
    public function testBetween(): void
Jens Segers's avatar
Jens Segers committed
134 135
    {
        $users = User::whereBetween('age', [0, 25])->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
136
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
137 138

        $users = User::whereBetween('age', [13, 23])->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
139
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
140 141 142

        // testing whereNotBetween for version 4.1
        $users = User::whereBetween('age', [0, 25], 'and', true)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
143
        $this->assertCount(6, $users);
Jens Segers's avatar
Jens Segers committed
144
    }
Jens Segers's avatar
Jens Segers committed
145

Simon Schaufelberger's avatar
Simon Schaufelberger committed
146
    public function testIn(): void
Jens Segers's avatar
Jens Segers committed
147 148
    {
        $users = User::whereIn('age', [13, 23])->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
149
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
150 151

        $users = User::whereIn('age', [33, 35, 13])->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
152
        $this->assertCount(6, $users);
Jens Segers's avatar
Jens Segers committed
153 154

        $users = User::whereNotIn('age', [33, 35])->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
155
        $this->assertCount(4, $users);
Jens Segers's avatar
Jens Segers committed
156

Jens Segers's avatar
Jens Segers committed
157
        $users = User::whereNotNull('age')
Jens Segers's avatar
Jens Segers committed
158
            ->whereNotIn('age', [33, 35])->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
159
        $this->assertCount(3, $users);
Jens Segers's avatar
Jens Segers committed
160 161
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
162
    public function testWhereNull(): void
Jens Segers's avatar
Jens Segers committed
163 164
    {
        $users = User::whereNull('age')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
165
        $this->assertCount(1, $users);
Jens Segers's avatar
Jens Segers committed
166 167
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
168
    public function testWhereNotNull(): void
Jens Segers's avatar
Jens Segers committed
169 170
    {
        $users = User::whereNotNull('age')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
171
        $this->assertCount(8, $users);
Jens Segers's avatar
Jens Segers committed
172 173
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
174
    public function testOrder(): void
Jens Segers's avatar
Jens Segers committed
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
    {
        $user = User::whereNotNull('age')->orderBy('age', 'asc')->first();
        $this->assertEquals(13, $user->age);

        $user = User::whereNotNull('age')->orderBy('age', 'ASC')->first();
        $this->assertEquals(13, $user->age);

        $user = User::whereNotNull('age')->orderBy('age', 'desc')->first();
        $this->assertEquals(37, $user->age);

        $user = User::whereNotNull('age')->orderBy('natural', 'asc')->first();
        $this->assertEquals(35, $user->age);

        $user = User::whereNotNull('age')->orderBy('natural', 'ASC')->first();
        $this->assertEquals(35, $user->age);

        $user = User::whereNotNull('age')->orderBy('natural', 'desc')->first();
        $this->assertEquals(35, $user->age);
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
195
    public function testGroupBy(): void
Jens Segers's avatar
Jens Segers committed
196 197
    {
        $users = User::groupBy('title')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
198
        $this->assertCount(3, $users);
Jens Segers's avatar
Jens Segers committed
199 200

        $users = User::groupBy('age')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
201
        $this->assertCount(6, $users);
Jens Segers's avatar
Jens Segers committed
202 203

        $users = User::groupBy('age')->skip(1)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
204
        $this->assertCount(5, $users);
Jens Segers's avatar
Jens Segers committed
205 206

        $users = User::groupBy('age')->take(2)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
207
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
208 209 210 211 212 213 214

        $users = User::groupBy('age')->orderBy('age', 'desc')->get();
        $this->assertEquals(37, $users[0]->age);
        $this->assertEquals(35, $users[1]->age);
        $this->assertEquals(33, $users[2]->age);

        $users = User::groupBy('age')->skip(1)->take(2)->orderBy('age', 'desc')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
215
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
216 217 218 219 220
        $this->assertEquals(35, $users[0]->age);
        $this->assertEquals(33, $users[1]->age);
        $this->assertNull($users[0]->name);

        $users = User::select('name')->groupBy('age')->skip(1)->take(2)->orderBy('age', 'desc')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
221
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
222 223 224
        $this->assertNotNull($users[0]->name);
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
225
    public function testCount(): void
Jens Segers's avatar
Jens Segers committed
226 227 228 229 230 231 232 233 234
    {
        $count = User::where('age', '<>', 35)->count();
        $this->assertEquals(6, $count);

        // Test for issue #165
        $count = User::select('_id', 'age', 'title')->where('age', '<>', 35)->count();
        $this->assertEquals(6, $count);
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
235
    public function testExists(): void
236 237 238 239 240
    {
        $this->assertFalse(User::where('age', '>', 37)->exists());
        $this->assertTrue(User::where('age', '<', 37)->exists());
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
241
    public function testSubQuery(): void
Jens Segers's avatar
Jens Segers committed
242
    {
Jens Segers's avatar
Jens Segers committed
243
        $users = User::where('title', 'admin')->orWhere(function ($query) {
244
            $query->where('name', 'Tommy Toe')
Jens Segers's avatar
Jens Segers committed
245
                ->orWhere('name', 'Error');
246
        })
Jens Segers's avatar
Jens Segers committed
247 248
            ->get();

Gabriel Caruso's avatar
Gabriel Caruso committed
249
        $this->assertCount(5, $users);
Jens Segers's avatar
Jens Segers committed
250

Jens Segers's avatar
Jens Segers committed
251
        $users = User::where('title', 'user')->where(function ($query) {
252
            $query->where('age', 35)
Jens Segers's avatar
Jens Segers committed
253
                ->orWhere('name', 'like', '%harry%');
254
        })
Jens Segers's avatar
Jens Segers committed
255 256
            ->get();

Gabriel Caruso's avatar
Gabriel Caruso committed
257
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
258

Jens Segers's avatar
Jens Segers committed
259
        $users = User::where('age', 35)->orWhere(function ($query) {
260
            $query->where('title', 'admin')
Jens Segers's avatar
Jens Segers committed
261
                ->orWhere('name', 'Error');
262
        })
Jens Segers's avatar
Jens Segers committed
263 264
            ->get();

Gabriel Caruso's avatar
Gabriel Caruso committed
265
        $this->assertCount(5, $users);
Jens Segers's avatar
Jens Segers committed
266 267

        $users = User::whereNull('deleted_at')
Jens Segers's avatar
Jens Segers committed
268 269 270 271 272 273
            ->where('title', 'admin')
            ->where(function ($query) {
                $query->where('age', '>', 15)
                    ->orWhere('name', 'Harry Hoe');
            })
            ->get();
Jens Segers's avatar
Jens Segers committed
274 275 276 277

        $this->assertEquals(3, $users->count());

        $users = User::whereNull('deleted_at')
Jens Segers's avatar
Jens Segers committed
278 279 280 281 282 283 284 285
            ->where(function ($query) {
                $query->where('name', 'Harry Hoe')
                    ->orWhere(function ($query) {
                        $query->where('age', '>', 15)
                            ->where('title', '<>', 'admin');
                    });
            })
            ->get();
Jens Segers's avatar
Jens Segers committed
286 287 288 289

        $this->assertEquals(5, $users->count());
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
290
    public function testWhereRaw(): void
Jens Segers's avatar
Jens Segers committed
291 292 293 294
    {
        $where = ['age' => ['$gt' => 30, '$lt' => 40]];
        $users = User::whereRaw($where)->get();

Gabriel Caruso's avatar
Gabriel Caruso committed
295
        $this->assertCount(6, $users);
Jens Segers's avatar
Jens Segers committed
296 297

        $where1 = ['age' => ['$gt' => 30, '$lte' => 35]];
Jens Segers's avatar
Jens Segers committed
298
        $where2 = ['age' => ['$gt' => 35, '$lt' => 40]];
Jens Segers's avatar
Jens Segers committed
299 300
        $users = User::whereRaw($where1)->orWhereRaw($where2)->get();

Gabriel Caruso's avatar
Gabriel Caruso committed
301
        $this->assertCount(6, $users);
Jens Segers's avatar
Jens Segers committed
302 303
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
304
    public function testMultipleOr(): void
Jens Segers's avatar
Jens Segers committed
305
    {
Jens Segers's avatar
Jens Segers committed
306
        $users = User::where(function ($query) {
Jens Segers's avatar
Jens Segers committed
307 308
            $query->where('age', 35)->orWhere('age', 33);
        })
Jens Segers's avatar
Jens Segers committed
309 310 311
            ->where(function ($query) {
                $query->where('name', 'John Doe')->orWhere('name', 'Jane Doe');
            })->get();
Jens Segers's avatar
Jens Segers committed
312

Gabriel Caruso's avatar
Gabriel Caruso committed
313
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
314

Jens Segers's avatar
Jens Segers committed
315
        $users = User::where(function ($query) {
Jens Segers's avatar
Jens Segers committed
316 317
            $query->orWhere('age', 35)->orWhere('age', 33);
        })
Jens Segers's avatar
Jens Segers committed
318 319 320
            ->where(function ($query) {
                $query->orWhere('name', 'John Doe')->orWhere('name', 'Jane Doe');
            })->get();
Jens Segers's avatar
Jens Segers committed
321

Gabriel Caruso's avatar
Gabriel Caruso committed
322
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
323 324
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
325
    public function testPaginate(): void
Jens Segers's avatar
Jens Segers committed
326 327 328 329 330 331 332 333 334 335 336 337
    {
        $results = User::paginate(2);
        $this->assertEquals(2, $results->count());
        $this->assertNotNull($results->first()->title);
        $this->assertEquals(9, $results->total());

        $results = User::paginate(2, ['name', 'age']);
        $this->assertEquals(2, $results->count());
        $this->assertNull($results->first()->title);
        $this->assertEquals(9, $results->total());
        $this->assertEquals(1, $results->currentPage());
    }
338

Simon Schaufelberger's avatar
Simon Schaufelberger committed
339
    public function testUpdate(): void
340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
    {
        $this->assertEquals(1, User::where(['name' => 'John Doe'])->update(['name' => 'Jim Morrison']));
        $this->assertEquals(1, User::where(['name' => 'Jim Morrison'])->count());

        Scoped::create(['favorite' => true]);
        Scoped::create(['favorite' => false]);

        $this->assertCount(1, Scoped::get());
        $this->assertEquals(1, Scoped::query()->update(['name' => 'Johnny']));
        $this->assertCount(1, Scoped::withoutGlobalScopes()->where(['name' => 'Johnny'])->get());

        $this->assertCount(2, Scoped::withoutGlobalScopes()->get());
        $this->assertEquals(2, Scoped::withoutGlobalScopes()->update(['name' => 'Jimmy']));
        $this->assertCount(2, Scoped::withoutGlobalScopes()->where(['name' => 'Jimmy'])->get());
    }
355
}