diff --git a/src/Illuminate/Database/Eloquent/Builder.php b/src/Illuminate/Database/Eloquent/Builder.php index f3fdf50027f1..e30ecb882810 100755 --- a/src/Illuminate/Database/Eloquent/Builder.php +++ b/src/Illuminate/Database/Eloquent/Builder.php @@ -465,7 +465,7 @@ public function firstOrNew(array $attributes = [], array $values = []) return $instance; } - return $this->newModelInstance($attributes + $values); + return $this->newModelInstance(array_merge($attributes, $values)); } /** @@ -481,7 +481,7 @@ public function firstOrCreate(array $attributes = [], array $values = []) return $instance; } - return tap($this->newModelInstance($attributes + $values), function ($instance) { + return tap($this->newModelInstance(array_merge($attributes, $values)), function ($instance) { $instance->save(); }); } diff --git a/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php b/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php index f3a50501fdd6..1c7ff591cd9c 100755 --- a/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php +++ b/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php @@ -214,7 +214,7 @@ public function findOrNew($id, $columns = ['*']) public function firstOrNew(array $attributes = [], array $values = []) { if (is_null($instance = $this->where($attributes)->first())) { - $instance = $this->related->newInstance($attributes + $values); + $instance = $this->related->newInstance(array_merge($attributes, $values)); $this->setForeignAttributesForCreate($instance); } @@ -232,7 +232,7 @@ public function firstOrNew(array $attributes = [], array $values = []) public function firstOrCreate(array $attributes = [], array $values = []) { if (is_null($instance = $this->where($attributes)->first())) { - $instance = $this->create($attributes + $values); + $instance = $this->create(array_merge($attributes, $values)); } return $instance; diff --git a/tests/Database/DatabaseEloquentIntegrationTest.php b/tests/Database/DatabaseEloquentIntegrationTest.php index 9624af06add4..f46d5e55b74c 100644 --- a/tests/Database/DatabaseEloquentIntegrationTest.php +++ b/tests/Database/DatabaseEloquentIntegrationTest.php @@ -401,6 +401,16 @@ public function testCursorPaginatedModelCollectionRetrievalWhenNoElementsAndDefa $this->assertInstanceOf(CursorPaginator::class, $models); } + public function testFirstOrNew() + { + $user1 = EloquentTestUser::firstOrNew( + ['name' => 'Dries Vints'], + ['name' => 'Nuno Maduro'] + ); + + $this->assertSame('Nuno Maduro', $user1->name); + } + public function testFirstOrCreate() { $user1 = EloquentTestUser::firstOrCreate(['email' => 'taylorotwell@gmail.com']); @@ -425,6 +435,13 @@ public function testFirstOrCreate() $this->assertNotEquals($user3->id, $user1->id); $this->assertSame('abigailotwell@gmail.com', $user3->email); $this->assertSame('Abigail Otwell', $user3->name); + + $user4 = EloquentTestUser::firstOrCreate( + ['name' => 'Dries Vints'], + ['name' => 'Nuno Maduro', 'email' => 'nuno@laravel.com'] + ); + + $this->assertSame('Nuno Maduro', $user4->name); } public function testUpdateOrCreate() @@ -678,6 +695,36 @@ public function testBasicModelHydration() $this->assertCount(1, $models); } + public function testFirstOrNewOnHasOneRelationShip() + { + $user1 = EloquentTestUser::create(['email' => 'taylorotwell@gmail.com']); + $post1 = $user1->post()->firstOrNew(['name' => 'First Post'], ['name' => 'New Post']); + + $this->assertSame('New Post', $post1->name); + + $user2 = EloquentTestUser::create(['email' => 'abigailotwell@gmail.com']); + $post = $user2->post()->create(['name' => 'First Post']); + $post2 = $user2->post()->firstOrNew(['name' => 'First Post'], ['name' => 'New Post']); + + $this->assertSame('First Post', $post2->name); + $this->assertSame($post->id, $post2->id); + } + + public function testFirstOrCreateOnHasOneRelationShip() + { + $user1 = EloquentTestUser::create(['email' => 'taylorotwell@gmail.com']); + $post1 = $user1->post()->firstOrCreate(['name' => 'First Post'], ['name' => 'New Post']); + + $this->assertSame('New Post', $post1->name); + + $user2 = EloquentTestUser::create(['email' => 'abigailotwell@gmail.com']); + $post = $user2->post()->create(['name' => 'First Post']); + $post2 = $user2->post()->firstOrCreate(['name' => 'First Post'], ['name' => 'New Post']); + + $this->assertSame('First Post', $post2->name); + $this->assertSame($post->id, $post2->id); + } + public function testHasOnSelfReferencingBelongsToManyRelationship() { $user = EloquentTestUser::create(['email' => 'taylorotwell@gmail.com']);