@@ -622,17 +622,25 @@ public function testSubdocumentArrayAggregate()
622
622
public function testAggregateGroupBy ()
623
623
{
624
624
DB ::table ('users ' )->insert ([
625
- ['name ' => 'John Doe ' , 'role ' => 'admin ' , 'score ' => 1 ],
626
- ['name ' => 'Jane Doe ' , 'role ' => 'admin ' , 'score ' => 2 ],
625
+ ['name ' => 'John Doe ' , 'role ' => 'admin ' , 'score ' => 1 , ' active ' => true ],
626
+ ['name ' => 'Jane Doe ' , 'role ' => 'admin ' , 'score ' => 2 , ' active ' => true ],
627
627
['name ' => 'Robert Roe ' , 'role ' => 'user ' , 'score ' => 4 ],
628
628
]);
629
629
630
630
$ results = DB ::table ('users ' )->groupBy ('role ' )->orderBy ('role ' )->aggregateByGroup ('count ' );
631
631
$ this ->assertInstanceOf (LaravelCollection::class, $ results );
632
632
$ this ->assertEquals ([(object ) ['role ' => 'admin ' , 'aggregate ' => 2 ], (object ) ['role ' => 'user ' , 'aggregate ' => 1 ]], $ results ->toArray ());
633
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
+
634
642
if (! method_exists (Builder::class, 'countByGroup ' )) {
635
- $ this ->markTestSkipped ('countBy* function require Laravel v11.38+ ' );
643
+ $ this ->markTestSkipped ('*byGroup functions require Laravel v11.38+ ' );
636
644
}
637
645
638
646
$ results = DB ::table ('users ' )->groupBy ('role ' )->orderBy ('role ' )->countByGroup ();
@@ -656,6 +664,14 @@ public function testAggregateGroupBy()
656
664
$ this ->assertEquals ([(object ) ['role ' => 'admin ' , 'aggregate ' => 1.5 ], (object ) ['role ' => 'user ' , 'aggregate ' => 4 ]], $ results ->toArray ());
657
665
}
658
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
+
659
675
public function testUpdateWithUpsert ()
660
676
{
661
677
DB ::table ('items ' )->where ('name ' , 'knife ' )
0 commit comments