From 335b30e7f2de6ef75dc998324cbd9a1a2141f324 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Tamarelle?= Date: Wed, 29 Jan 2025 13:38:22 +0100 Subject: [PATCH] Fix aggregation alias --- src/Eloquent/Builder.php | 2 +- tests/Eloquent/EloquentWithAggregateTest.php | 40 ++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/Eloquent/Builder.php b/src/Eloquent/Builder.php index ed1525bb6..36f200262 100644 --- a/src/Eloquent/Builder.php +++ b/src/Eloquent/Builder.php @@ -342,7 +342,7 @@ public function withAggregate($relations, $column, $function = null) $alias = match (true) { count($segments) === 1 => Str::snake($segments[0]) . '_' . $function, - count($segments) === 3 && Str::lower($segments[1]) => $segments[2], + count($segments) === 3 && Str::lower($segments[1]) === 'as' => $segments[2], default => throw new InvalidArgumentException(sprintf('Invalid relation name format. Expected "relation as alias" or "relation", got "%s"', $name)), }; $name = $segments[0]; diff --git a/tests/Eloquent/EloquentWithAggregateTest.php b/tests/Eloquent/EloquentWithAggregateTest.php index 117a6f6db..749b68f05 100644 --- a/tests/Eloquent/EloquentWithAggregateTest.php +++ b/tests/Eloquent/EloquentWithAggregateTest.php @@ -11,6 +11,7 @@ use MongoDB\Laravel\Tests\Eloquent\Models\EloquentWithAggregateModel3; use MongoDB\Laravel\Tests\Eloquent\Models\EloquentWithAggregateModel4; use MongoDB\Laravel\Tests\TestCase; +use PHPUnit\Framework\Attributes\TestWith; use function count; use function ksort; @@ -55,6 +56,45 @@ public function testWithAggregate() ], $results->get()); } + public function testWithAggregateAlias() + { + EloquentWithAggregateModel1::create(['id' => 1]); + $one = EloquentWithAggregateModel1::create(['id' => 2]); + $one->twos()->create(['value' => 4]); + $one->twos()->create(['value' => 6]); + + $results = EloquentWithAggregateModel1::withCount('twos as result')->where('id', 2); + self::assertSameResults([ + ['id' => 2, 'result' => 2], + ], $results->get()); + + $results = EloquentWithAggregateModel1::withMax('twos as result', 'value')->where('id', 2); + self::assertSameResults([ + ['id' => 2, 'result' => 6], + ], $results->get()); + + $results = EloquentWithAggregateModel1::withMin('twos as result', 'value')->where('id', 2); + self::assertSameResults([ + ['id' => 2, 'result' => 4], + ], $results->get()); + + $results = EloquentWithAggregateModel1::withAvg('twos as result', 'value')->where('id', 2); + self::assertSameResults([ + ['id' => 2, 'result' => 5.0], + ], $results->get()); + } + + #[TestWith(['withCount'])] + #[TestWith(['withMax'])] + #[TestWith(['withMin'])] + #[TestWith(['withAvg'])] + public function testWithAggregateInvalidAlias(string $method) + { + self::expectException(InvalidArgumentException::class); + self::expectExceptionMessage('Expected "relation as alias" or "relation", got "twos foo result"'); + EloquentWithAggregateModel1::{$method}('twos foo result', 'value')->get(); + } + public function testWithAggregateEmbed() { EloquentWithAggregateModel1::create(['id' => 1]);