Skip to content

Commit c7e8563

Browse files
committed
[QueryBuilder] multiply support
1 parent b5864f4 commit c7e8563

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

src/Query/Builder.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -890,6 +890,27 @@ public function decrementEach(array $columns, array $extra = [], array $options
890890
return $this->incrementEach($decrement, $extra, $options);
891891
}
892892

893+
/** @inheritdoc */
894+
public function multiply($column, $amount = 1, array $extra = [], array $options = [])
895+
{
896+
$query = ['$mul' => [(string) $column => $amount]];
897+
898+
if (! empty($extra)) {
899+
$query['$set'] = $extra;
900+
}
901+
902+
// Protect
903+
$this->where(function ($query) use ($column) {
904+
$query->where($column, 'exists', false);
905+
906+
$query->orWhereNotNull($column);
907+
});
908+
909+
$options = $this->inheritConnectionOptions($options);
910+
911+
return $this->performUpdate($query, $options);
912+
}
913+
893914
/** @inheritdoc */
894915
public function pluck($column, $key = null)
895916
{

tests/QueryBuilderTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,6 +1052,42 @@ public function testIncrement()
10521052
$this->assertEquals(1, $user->age);
10531053
}
10541054

1055+
public function testMultiply()
1056+
{
1057+
DB::table('users')->insert([
1058+
['name' => 'John Doe', 'salary' => 3000, 'note' => 'adult'],
1059+
['name' => 'Jane Doe', 'salary' => 1000, 'note' => 'minor'],
1060+
['name' => 'Robert Roe', 'salary' => null],
1061+
['name' => 'Mark Moe'],
1062+
]);
1063+
1064+
$user = DB::table('users')->where('name', 'John Doe')->first();
1065+
$this->assertEquals(3000, $user->salary);
1066+
1067+
DB::table('users')->where('name', 'John Doe')->multiply('salary');
1068+
$user = DB::table('users')->where('name', 'John Doe')->first();
1069+
$this->assertEquals(3000, $user->salary);
1070+
1071+
DB::table('users')->where('name', 'John Doe')->multiply('salary', 2);
1072+
$user = DB::table('users')->where('name', 'John Doe')->first();
1073+
$this->assertEquals(6000, $user->salary);
1074+
1075+
DB::table('users')->where('name', 'Jane Doe')->multiply('salary', 10, ['note' => 'adult']);
1076+
$user = DB::table('users')->where('name', 'Jane Doe')->first();
1077+
$this->assertEquals(10000, $user->salary);
1078+
$this->assertEquals('adult', $user->note);
1079+
1080+
DB::table('users')->multiply('salary');
1081+
$user = DB::table('users')->where('name', 'John Doe')->first();
1082+
$this->assertEquals(6000, $user->salary);
1083+
$user = DB::table('users')->where('name', 'Jane Doe')->first();
1084+
$this->assertEquals(10000, $user->salary);
1085+
$user = DB::table('users')->where('name', 'Robert Roe')->first();
1086+
$this->assertNull($user->salary);
1087+
$user = DB::table('users')->where('name', 'Mark Moe')->first();
1088+
$this->assertEquals(0, $user->salary);
1089+
}
1090+
10551091
public function testProjections()
10561092
{
10571093
DB::table('items')->insert([

0 commit comments

Comments
 (0)