From 729cd960e68bcc824b906be23685d80957e50dc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Tamarelle?= Date: Mon, 14 Apr 2025 15:42:33 +0200 Subject: [PATCH 1/2] PHPORM-320 Fix aliasing .id field path to ._id --- src/Query/Builder.php | 2 +- tests/Query/BuilderTest.php | 89 ++++++++++++++++++++++++++++++------- 2 files changed, 74 insertions(+), 17 deletions(-) diff --git a/src/Query/Builder.php b/src/Query/Builder.php index 7d0fdce74..6823998fd 100644 --- a/src/Query/Builder.php +++ b/src/Query/Builder.php @@ -1795,7 +1795,7 @@ private function aliasIdForQuery(array $values, bool $root = true): array } // ".id" subfield are alias for "._id" - if (str_ends_with($key, '.id') && ($root || $this->connection->getRenameEmbeddedIdField())) { + if (str_ends_with($key, '.id') && $this->connection->getRenameEmbeddedIdField()) { $newkey = substr($key, 0, -3) . '._id'; if (array_key_exists($newkey, $values) && $value !== $values[$newkey]) { throw new InvalidArgumentException(sprintf('Cannot have both "%s" and "%s" fields.', $key, $newkey)); diff --git a/tests/Query/BuilderTest.php b/tests/Query/BuilderTest.php index 6e68d42c7..7595976f3 100644 --- a/tests/Query/BuilderTest.php +++ b/tests/Query/BuilderTest.php @@ -1599,29 +1599,86 @@ public static function getEloquentMethodsNotSupported() yield 'orWhereIntegerNotInRaw' => [fn (Builder $builder) => $builder->orWhereIntegerNotInRaw('id', ['1a', 2])]; } - public function testRenameEmbeddedIdFieldCanBeDisabled() + #[DataProvider('provideDisableRenameEmbeddedIdField')] + public function testDisableRenameEmbeddedIdField(array $expected, Closure $build) { $builder = $this->getBuilder(false); $this->assertFalse($builder->getConnection()->getRenameEmbeddedIdField()); - $mql = $builder - ->where('id', '=', 10) - ->where('nested.id', '=', 20) - ->where('embed', '=', ['id' => 30]) - ->toMql(); - - $this->assertEquals([ - 'find' => [ - [ - '$and' => [ - ['_id' => 10], - ['nested.id' => 20], - ['embed' => ['id' => 30]], + $mql = $build($builder)->toMql(); + + $this->assertEquals($expected, $mql); + } + + public static function provideDisableRenameEmbeddedIdField() + { + yield 'rename embedded id field' => [ + [ + 'find' => [ + [ + '$and' => [ + ['_id' => 10], + ['nested.id' => 20], + ['embed' => ['id' => 30]], + ], + ], + ['typeMap' => ['root' => 'object', 'document' => 'array']], + ], + ], + fn (Builder $builder) => $builder->where('id', '=', 10) + ->where('nested.id', '=', 20) + ->where('embed', '=', ['id' => 30]), + ]; + + yield 'rename root id' => [ + ['find' => [['_id' => 10], ['typeMap' => ['root' => 'object', 'document' => 'array']]]], + fn (Builder $builder) => $builder->where('id', '=', 10), + ]; + + yield 'nested id not renamed' => [ + ['find' => [['nested.id' => 20], ['typeMap' => ['root' => 'object', 'document' => 'array']]]], + fn (Builder $builder) => $builder->where('nested.id', '=', 20), + ]; + + yield 'embed id not renamed' => [ + ['find' => [['embed' => ['id' => 30]], ['typeMap' => ['root' => 'object', 'document' => 'array']]]], + fn (Builder $builder) => $builder->where('embed', '=', ['id' => 30]), + ]; + + yield 'nested $and in $or' => [ + [ + 'find' => [ + [ + '$or' => [ + [ + '$and' => [ + ['_id' => 10], + ['nested.id' => 20], + ['embed' => ['id' => 30]], + ], + ], + [ + '$and' => [ + ['_id' => 40], + ['nested.id' => 50], + ['embed' => ['id' => 60]], + ], + ], + ], ], + ['typeMap' => ['root' => 'object', 'document' => 'array']], ], - ['typeMap' => ['root' => 'object', 'document' => 'array']], ], - ], $mql); + fn (Builder $builder) => $builder->orWhere(function (Builder $builder) { + return $builder->where('id', '=', 10) + ->where('nested.id', '=', 20) + ->where('embed', '=', ['id' => 30]); + })->orWhere(function (Builder $builder) { + return $builder->where('id', '=', 40) + ->where('nested.id', '=', 50) + ->where('embed', '=', ['id' => 60]); + }), + ]; } private function getBuilder(bool $renameEmbeddedIdField = true): Builder From 90c6b2a1b0a1c587add6de65a5422b161543c462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Tamarelle?= Date: Mon, 14 Apr 2025 17:17:06 +0200 Subject: [PATCH 2/2] Fix driver matrix --- .github/workflows/build-ci.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-ci.yml b/.github/workflows/build-ci.yml index 6ff13a7f0..6fec7bb28 100644 --- a/.github/workflows/build-ci.yml +++ b/.github/workflows/build-ci.yml @@ -34,20 +34,24 @@ jobs: - "11.*" - "12.*" driver: - - 1 + - 2 include: - php: "8.1" laravel: "10.*" mongodb: "5.0" mode: "low-deps" os: "ubuntu-latest" - driver: 1.x - driver_version: "1.21.0" + driver: 1 + - php: "8.3" + laravel: "11.*" + mongodb: "8.0" + os: "ubuntu-latest" + driver: 1 - php: "8.4" laravel: "12.*" mongodb: "8.0" os: "ubuntu-latest" - driver: 2 + driver: 1 exclude: - php: "8.1" laravel: "11.*"