|
25 | 25 | use Illuminate\Pagination\Cursor;
|
26 | 26 | use Illuminate\Pagination\CursorPaginator;
|
27 | 27 | use Illuminate\Pagination\LengthAwarePaginator;
|
| 28 | +use Illuminate\Support\Collection; |
28 | 29 | use Illuminate\Tests\Database\Fixtures\Enums\Bar;
|
29 | 30 | use InvalidArgumentException;
|
30 | 31 | use Mockery as m;
|
@@ -1804,6 +1805,38 @@ public function testGroupBys()
|
1804 | 1805 | $this->assertEquals(['whereRawBinding', 'groupByRawBinding', 'havingRawBinding'], $builder->getBindings());
|
1805 | 1806 | }
|
1806 | 1807 |
|
| 1808 | + public function testAggregateByGroup() |
| 1809 | + { |
| 1810 | + $builder = $this->getBuilder(); |
| 1811 | + |
| 1812 | + $queryResults = [['aggregate' => 2, 'role' => 'admin', 'city' => 'NY'], ['aggregate' => 5, 'role' => 'user', 'city' => 'LA']]; |
| 1813 | + $builder->getConnection() |
| 1814 | + ->shouldReceive('select')->once() |
| 1815 | + ->with('select count(*) as aggregate, "role", "city" from "users" group by "role", "city"', [], true) |
| 1816 | + ->andReturn($queryResults); |
| 1817 | + $builder->getProcessor()->shouldReceive('processSelect')->once()->andReturnUsing(fn ($builder, $results) => $results); |
| 1818 | + $builder->from('users')->groupBy('role', 'city'); |
| 1819 | + $builder->aggregate = ['function' => 'count', 'columns' => ['*']]; |
| 1820 | + $results = $builder->get(); |
| 1821 | + $this->assertEquals($queryResults, $results->toArray()); |
| 1822 | + } |
| 1823 | + |
| 1824 | + public function testUnionAndAggregateByGroup() |
| 1825 | + { |
| 1826 | + $builder = $this->getBuilder(); |
| 1827 | + |
| 1828 | + $queryResults = [['aggregate' => 2, 'role' => 'admin'], ['aggregate' => 5, 'role' => 'user']]; |
| 1829 | + $builder->getConnection() |
| 1830 | + ->shouldReceive('select')->once() |
| 1831 | + ->with('select count(*) as aggregate, "role" from ((select * from "users") union (select * from "members")) as "temp_table" group by "role"', [], true) |
| 1832 | + ->andReturn($queryResults); |
| 1833 | + $builder->getProcessor()->shouldReceive('processSelect')->once()->andReturnUsing(fn ($builder, $results) => $results); |
| 1834 | + $results = $builder->from('users') |
| 1835 | + ->union($this->getBuilder()->select('*')->from('members')) |
| 1836 | + ->groupBy('role')->aggregateByGroup('count'); |
| 1837 | + $this->assertEquals($queryResults, $results->toArray()); |
| 1838 | + } |
| 1839 | + |
1807 | 1840 | public function testOrderBys()
|
1808 | 1841 | {
|
1809 | 1842 | $builder = $this->getBuilder();
|
@@ -3464,6 +3497,44 @@ public function testAggregateFunctions()
|
3464 | 3497 | $this->assertEquals(1, $results);
|
3465 | 3498 | }
|
3466 | 3499 |
|
| 3500 | + public function testAggregateFunctionsWithGroupBy() |
| 3501 | + { |
| 3502 | + $builder = $this->getBuilder(); |
| 3503 | + $builder->getConnection()->shouldReceive('select')->once()->with('select count(*) as aggregate, "role" from "users" group by "role"', [], true)->andReturn([['role' => 'admin', 'aggregate' => 1]]); |
| 3504 | + $builder->getProcessor()->shouldReceive('processSelect')->once()->andReturnUsing(fn ($builder, $results) => $results); |
| 3505 | + $results = $builder->from('users')->groupBy('role')->countByGroup(); |
| 3506 | + $this->assertInstanceOf(Collection::class, $results); |
| 3507 | + $this->assertEquals([['role' => 'admin', 'aggregate' => 1]], $results->toArray()); |
| 3508 | + |
| 3509 | + $builder = $this->getBuilder(); |
| 3510 | + $builder->getConnection()->shouldReceive('select')->once()->with('select max("id") as aggregate, "role" from "users" group by "role"', [], true)->andReturn([['role' => 'admin', 'aggregate' => 1]]); |
| 3511 | + $builder->getProcessor()->shouldReceive('processSelect')->once()->andReturnUsing(fn ($builder, $results) => $results); |
| 3512 | + $results = $builder->from('users')->groupBy('role')->maxByGroup('id'); |
| 3513 | + $this->assertInstanceOf(Collection::class, $results); |
| 3514 | + $this->assertEquals([['role' => 'admin', 'aggregate' => 1]], $results->toArray()); |
| 3515 | + |
| 3516 | + $builder = $this->getBuilder(); |
| 3517 | + $builder->getConnection()->shouldReceive('select')->once()->with('select min("id") as aggregate, "role" from "users" group by "role"', [], true)->andReturn([['role' => 'admin', 'aggregate' => 1]]); |
| 3518 | + $builder->getProcessor()->shouldReceive('processSelect')->once()->andReturnUsing(fn ($builder, $results) => $results); |
| 3519 | + $results = $builder->from('users')->groupBy('role')->minByGroup('id'); |
| 3520 | + $this->assertInstanceOf(Collection::class, $results); |
| 3521 | + $this->assertEquals([['role' => 'admin', 'aggregate' => 1]], $results->toArray()); |
| 3522 | + |
| 3523 | + $builder = $this->getBuilder(); |
| 3524 | + $builder->getConnection()->shouldReceive('select')->once()->with('select sum("id") as aggregate, "role" from "users" group by "role"', [], true)->andReturn([['role' => 'admin', 'aggregate' => 1]]); |
| 3525 | + $builder->getProcessor()->shouldReceive('processSelect')->once()->andReturnUsing(fn ($builder, $results) => $results); |
| 3526 | + $results = $builder->from('users')->groupBy('role')->sumByGroup('id'); |
| 3527 | + $this->assertInstanceOf(Collection::class, $results); |
| 3528 | + $this->assertEquals([['role' => 'admin', 'aggregate' => 1]], $results->toArray()); |
| 3529 | + |
| 3530 | + $builder = $this->getBuilder(); |
| 3531 | + $builder->getConnection()->shouldReceive('select')->once()->with('select avg("id") as aggregate, "role" from "users" group by "role"', [], true)->andReturn([['role' => 'admin', 'aggregate' => 1]]); |
| 3532 | + $builder->getProcessor()->shouldReceive('processSelect')->once()->andReturnUsing(fn ($builder, $results) => $results); |
| 3533 | + $results = $builder->from('users')->groupBy('role')->avgByGroup('id'); |
| 3534 | + $this->assertInstanceOf(Collection::class, $results); |
| 3535 | + $this->assertEquals([['role' => 'admin', 'aggregate' => 1]], $results->toArray()); |
| 3536 | + } |
| 3537 | + |
3467 | 3538 | public function testSqlServerExists()
|
3468 | 3539 | {
|
3469 | 3540 | $builder = $this->getSqlServerBuilder();
|
|
0 commit comments