From 161cb8c31359b32dfc0ded386405232bff59c0f0 Mon Sep 17 00:00:00 2001 From: Andreas Braun Date: Mon, 21 Jul 2025 08:59:17 +0200 Subject: [PATCH] PHPORM-369: Fix ID handling when using insert method instead of save (#3429) * Fix ID handling when using insert method instead of save * Add test with non-incrementing model --- src/Query/Builder.php | 5 ++++- tests/ModelTest.php | 22 ++++++++++++++++++++++ tests/Models/NonIncrementing.php | 26 ++++++++++++++++++++++++++ tests/QueryBuilderTest.php | 16 ++++++++++++++++ 4 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 tests/Models/NonIncrementing.php diff --git a/src/Query/Builder.php b/src/Query/Builder.php index 6823998fd..321672e6f 100644 --- a/src/Query/Builder.php +++ b/src/Query/Builder.php @@ -745,7 +745,10 @@ public function insert(array $values) $values = [$values]; } - $values = $this->aliasIdForQuery($values); + $values = array_map( + $this->aliasIdForQuery(...), + $values, + ); $options = $this->inheritConnectionOptions(); diff --git a/tests/ModelTest.php b/tests/ModelTest.php index ecfcb2b6a..88bd27e44 100644 --- a/tests/ModelTest.php +++ b/tests/ModelTest.php @@ -25,6 +25,7 @@ use MongoDB\Laravel\Tests\Models\IdIsString; use MongoDB\Laravel\Tests\Models\Item; use MongoDB\Laravel\Tests\Models\MemberStatus; +use MongoDB\Laravel\Tests\Models\NonIncrementing; use MongoDB\Laravel\Tests\Models\Soft; use MongoDB\Laravel\Tests\Models\SqlUser; use MongoDB\Laravel\Tests\Models\User; @@ -56,6 +57,7 @@ public function tearDown(): void Book::truncate(); Item::truncate(); Guarded::truncate(); + NonIncrementing::truncate(); parent::tearDown(); } @@ -106,6 +108,26 @@ public function testInsert(): void $this->assertEquals(35, $user->age); } + public function testInsertNonIncrementable(): void + { + $connection = DB::connection('mongodb'); + $connection->setRenameEmbeddedIdField(false); + + $nonIncrementing = new NonIncrementing(); + $nonIncrementing->id = '12345'; + $nonIncrementing->name = 'John Doe'; + + $nonIncrementing->save(); + + $this->assertTrue($nonIncrementing->exists); + $this->assertEquals(1, NonIncrementing::count()); + + $check = NonIncrementing::find($nonIncrementing->id); + $this->assertInstanceOf(NonIncrementing::class, $check); + $this->assertSame('12345', $check->id); + $this->assertEquals('John Doe', $check->name); + } + public function testUpdate(): void { $user = new User(); diff --git a/tests/Models/NonIncrementing.php b/tests/Models/NonIncrementing.php new file mode 100644 index 000000000..8a9ab31e2 --- /dev/null +++ b/tests/Models/NonIncrementing.php @@ -0,0 +1,26 @@ +assertIsArray($user->tags); } + #[TestWith([true])] + #[TestWith([false])] + public function testInsertWithCustomId(bool $renameEmbeddedIdField) + { + $connection = DB::connection('mongodb'); + $connection->setRenameEmbeddedIdField($renameEmbeddedIdField); + + $data = ['id' => 'abcdef', 'name' => 'John Doe']; + + DB::table('users')->insert($data); + + $user = User::find('abcdef'); + $this->assertInstanceOf(User::class, $user); + $this->assertSame('abcdef', $user->id); + } + public function testInsertGetId() { $id = DB::table('users')->insertGetId(['name' => 'John Doe']);