|
7 | 7 | use Carbon\Carbon;
|
8 | 8 | use DateTime;
|
9 | 9 | use DateTimeImmutable;
|
| 10 | +use Illuminate\Support\Collection as LaravelCollection; |
10 | 11 | use Illuminate\Support\Facades\Date;
|
11 | 12 | use Illuminate\Support\Facades\DB;
|
12 | 13 | use Illuminate\Support\LazyCollection;
|
|
32 | 33 | use function count;
|
33 | 34 | use function key;
|
34 | 35 | use function md5;
|
| 36 | +use function method_exists; |
35 | 37 | use function sort;
|
36 | 38 | use function strlen;
|
37 | 39 |
|
@@ -617,6 +619,59 @@ public function testSubdocumentArrayAggregate()
|
617 | 619 | $this->assertEquals(12, DB::table('items')->avg('amount.*.hidden'));
|
618 | 620 | }
|
619 | 621 |
|
| 622 | + public function testAggregateGroupBy() |
| 623 | + { |
| 624 | + DB::table('users')->insert([ |
| 625 | + ['name' => 'John Doe', 'role' => 'admin', 'score' => 1, 'active' => true], |
| 626 | + ['name' => 'Jane Doe', 'role' => 'admin', 'score' => 2, 'active' => true], |
| 627 | + ['name' => 'Robert Roe', 'role' => 'user', 'score' => 4], |
| 628 | + ]); |
| 629 | + |
| 630 | + $results = DB::table('users')->groupBy('role')->orderBy('role')->aggregateByGroup('count'); |
| 631 | + $this->assertInstanceOf(LaravelCollection::class, $results); |
| 632 | + $this->assertEquals([(object) ['role' => 'admin', 'aggregate' => 2], (object) ['role' => 'user', 'aggregate' => 1]], $results->toArray()); |
| 633 | + |
| 634 | + $results = DB::table('users')->groupBy('role')->orderBy('role')->aggregateByGroup('count', ['active']); |
| 635 | + $this->assertInstanceOf(LaravelCollection::class, $results); |
| 636 | + $this->assertEquals([(object) ['role' => 'admin', 'aggregate' => 1], (object) ['role' => 'user', 'aggregate' => 0]], $results->toArray()); |
| 637 | + |
| 638 | + $results = DB::table('users')->groupBy('role')->orderBy('role')->aggregateByGroup('max', ['score']); |
| 639 | + $this->assertInstanceOf(LaravelCollection::class, $results); |
| 640 | + $this->assertEquals([(object) ['role' => 'admin', 'aggregate' => 2], (object) ['role' => 'user', 'aggregate' => 4]], $results->toArray()); |
| 641 | + |
| 642 | + if (! method_exists(Builder::class, 'countByGroup')) { |
| 643 | + $this->markTestSkipped('*byGroup functions require Laravel v11.38+'); |
| 644 | + } |
| 645 | + |
| 646 | + $results = DB::table('users')->groupBy('role')->orderBy('role')->countByGroup(); |
| 647 | + $this->assertInstanceOf(LaravelCollection::class, $results); |
| 648 | + $this->assertEquals([(object) ['role' => 'admin', 'aggregate' => 2], (object) ['role' => 'user', 'aggregate' => 1]], $results->toArray()); |
| 649 | + |
| 650 | + $results = DB::table('users')->groupBy('role')->orderBy('role')->maxByGroup('score'); |
| 651 | + $this->assertInstanceOf(LaravelCollection::class, $results); |
| 652 | + $this->assertEquals([(object) ['role' => 'admin', 'aggregate' => 2], (object) ['role' => 'user', 'aggregate' => 4]], $results->toArray()); |
| 653 | + |
| 654 | + $results = DB::table('users')->groupBy('role')->orderBy('role')->minByGroup('score'); |
| 655 | + $this->assertInstanceOf(LaravelCollection::class, $results); |
| 656 | + $this->assertEquals([(object) ['role' => 'admin', 'aggregate' => 1], (object) ['role' => 'user', 'aggregate' => 4]], $results->toArray()); |
| 657 | + |
| 658 | + $results = DB::table('users')->groupBy('role')->orderBy('role')->sumByGroup('score'); |
| 659 | + $this->assertInstanceOf(LaravelCollection::class, $results); |
| 660 | + $this->assertEquals([(object) ['role' => 'admin', 'aggregate' => 3], (object) ['role' => 'user', 'aggregate' => 4]], $results->toArray()); |
| 661 | + |
| 662 | + $results = DB::table('users')->groupBy('role')->orderBy('role')->avgByGroup('score'); |
| 663 | + $this->assertInstanceOf(LaravelCollection::class, $results); |
| 664 | + $this->assertEquals([(object) ['role' => 'admin', 'aggregate' => 1.5], (object) ['role' => 'user', 'aggregate' => 4]], $results->toArray()); |
| 665 | + } |
| 666 | + |
| 667 | + public function testAggregateByGroupException(): void |
| 668 | + { |
| 669 | + $this->expectException(InvalidArgumentException::class); |
| 670 | + $this->expectExceptionMessage('Aggregating by group requires zero or one columns.'); |
| 671 | + |
| 672 | + DB::table('users')->aggregateByGroup('max', ['foo', 'bar']); |
| 673 | + } |
| 674 | + |
620 | 675 | public function testUpdateWithUpsert()
|
621 | 676 | {
|
622 | 677 | DB::table('items')->where('name', 'knife')
|
|
0 commit comments