Skip to content

Commit 40eca7d

Browse files
authored
Added method Hyperf\Database\Model\Builder::incrementOrCreate() (#7480)
1 parent 821175f commit 40eca7d

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

src/Model/Builder.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,18 @@ public function updateOrCreate(array $attributes, array $values = [])
604604
});
605605
}
606606

607+
/**
608+
* Create a record matching the attributes, or increment the existing record.
609+
*/
610+
public function incrementOrCreate(array $attributes, string $column = 'count', float|int $default = 1, float|int $step = 1, array $extra = []): Model
611+
{
612+
return tap($this->firstOrCreate($attributes, [$column => $default]), function ($instance) use ($column, $step, $extra) {
613+
if (! $instance->wasRecentlyCreated) {
614+
$instance->increment($column, $step, $extra);
615+
}
616+
});
617+
}
618+
607619
/**
608620
* Execute the query and get the first result or throw an exception.
609621
*

tests/DatabaseIntegrationTest.php

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,53 @@ public function testWithWhereHasOnNestedSelfReferencingHasManyRelationship()
264264
$this->assertSame($results->first()->childPosts->pluck('childPosts')->flatten()->pluck('name')->unique()->toArray(), ['Child Post']);
265265
}
266266

267+
public function testIncrementOrCreate()
268+
{
269+
$user1 = ModelTestUser::incrementOrCreate(['email' => 'test@example.com'], 'value');
270+
$this->assertTrue($user1->wasRecentlyCreated);
271+
$this->assertSame('test@example.com', $user1->email);
272+
$this->assertEquals(1, $user1->value);
273+
274+
$user2 = ModelTestUser::incrementOrCreate(['email' => 'test@example.com'], 'value');
275+
$this->assertFalse($user2->wasRecentlyCreated);
276+
$this->assertEquals($user1->id, $user2->id);
277+
$this->assertEquals(2, $user2->value);
278+
279+
$user3 = ModelTestUser::incrementOrCreate(['email' => 'test2@example.com'], 'value', 10, 5);
280+
$this->assertTrue($user3->wasRecentlyCreated);
281+
$this->assertEquals(10, $user3->value);
282+
283+
$user4 = ModelTestUser::incrementOrCreate(['email' => 'test2@example.com'], 'value', 10, 5);
284+
$this->assertFalse($user4->wasRecentlyCreated);
285+
$this->assertEquals(15, $user4->value);
286+
287+
$user5 = ModelTestUser::incrementOrCreate(['email' => 'test3@example.com'], 'value', 1, 1, ['name' => 'Test User']);
288+
$this->assertTrue($user5->wasRecentlyCreated);
289+
$this->assertEquals(1, $user5->value);
290+
$this->assertNull($user5->name);
291+
292+
$user6 = ModelTestUser::incrementOrCreate(['email' => 'test3@example.com'], 'value', 1, 1, ['name' => 'Updated User']);
293+
$this->assertFalse($user6->wasRecentlyCreated);
294+
$this->assertEquals(2, $user6->value);
295+
$this->assertSame('Updated User', $user6->name);
296+
}
297+
298+
public function testIncrementOrCreateOnDifferentConnection()
299+
{
300+
$user1 = ModelTestUser::on('second_connection')->incrementOrCreate(['email' => 'test@example.com'], 'value');
301+
$this->assertTrue($user1->wasRecentlyCreated);
302+
$this->assertSame('second_connection', $user1->getConnectionName());
303+
$this->assertEquals(1, $user1->value);
304+
305+
$user2 = ModelTestUser::on('second_connection')->incrementOrCreate(['email' => 'test@example.com'], 'value');
306+
$this->assertFalse($user2->wasRecentlyCreated);
307+
$this->assertSame('second_connection', $user2->getConnectionName());
308+
$this->assertEquals(2, $user2->value);
309+
310+
$this->assertEquals(0, ModelTestUser::count());
311+
$this->assertEquals(1, ModelTestUser::on('second_connection')->count());
312+
}
313+
267314
protected function createSchema(): void
268315
{
269316
foreach (['default', 'second_connection'] as $connection) {

0 commit comments

Comments
 (0)