Skip to content

Commit e2b119a

Browse files
authored
PHPORM-351 QueryBuilder multiply and divide support (#3373)
1 parent 5fe1f5d commit e2b119a

File tree

2 files changed

+90
-0
lines changed

2 files changed

+90
-0
lines changed

src/Query/Builder.php

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

893+
/**
894+
* Multiply a column's value by a given amount.
895+
*
896+
* @param string $column
897+
* @param float|int $amount
898+
*
899+
* @return int
900+
*/
901+
public function multiply($column, $amount, array $extra = [], array $options = [])
902+
{
903+
$query = ['$mul' => [(string) $column => $amount]];
904+
905+
if (! empty($extra)) {
906+
$query['$set'] = $extra;
907+
}
908+
909+
// Protect
910+
$this->where(function ($query) use ($column) {
911+
$query->where($column, 'exists', true);
912+
913+
$query->whereNotNull($column);
914+
});
915+
916+
$options = $this->inheritConnectionOptions($options);
917+
918+
return $this->performUpdate($query, $options);
919+
}
920+
921+
/**
922+
* Divide a column's value by a given amount.
923+
*
924+
* @param string $column
925+
* @param float|int $amount
926+
*
927+
* @return int
928+
*/
929+
public function divide($column, $amount, array $extra = [], array $options = [])
930+
{
931+
return $this->multiply($column, 1 / $amount, $extra, $options);
932+
}
933+
893934
/** @inheritdoc */
894935
public function pluck($column, $key = null)
895936
{

tests/QueryBuilderTest.php

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

1055+
public function testMultiplyAndDivide()
1056+
{
1057+
DB::table('users')->insert([
1058+
['name' => 'John Doe', 'salary' => 88000, 'note' => 'senior'],
1059+
['name' => 'Jane Doe', 'salary' => 64000, 'note' => 'junior'],
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(88000, $user->salary);
1066+
1067+
DB::table('users')->where('name', 'John Doe')->multiply('salary', 1);
1068+
$user = DB::table('users')->where('name', 'John Doe')->first();
1069+
$this->assertEquals(88000, $user->salary);
1070+
1071+
DB::table('users')->where('name', 'John Doe')->divide('salary', 1);
1072+
$user = DB::table('users')->where('name', 'John Doe')->first();
1073+
$this->assertEquals(88000, $user->salary);
1074+
1075+
DB::table('users')->where('name', 'John Doe')->multiply('salary', 2);
1076+
$user = DB::table('users')->where('name', 'John Doe')->first();
1077+
$this->assertEquals(176000, $user->salary);
1078+
1079+
DB::table('users')->where('name', 'John Doe')->divide('salary', 2);
1080+
$user = DB::table('users')->where('name', 'John Doe')->first();
1081+
$this->assertEquals(88000, $user->salary);
1082+
1083+
DB::table('users')->where('name', 'Jane Doe')->multiply('salary', 10, ['note' => 'senior']);
1084+
$user = DB::table('users')->where('name', 'Jane Doe')->first();
1085+
$this->assertEquals(640000, $user->salary);
1086+
$this->assertEquals('senior', $user->note);
1087+
1088+
DB::table('users')->where('name', 'John Doe')->divide('salary', 2, ['note' => 'junior']);
1089+
$user = DB::table('users')->where('name', 'John Doe')->first();
1090+
$this->assertEquals(44000, $user->salary);
1091+
$this->assertEquals('junior', $user->note);
1092+
1093+
DB::table('users')->multiply('salary', 1);
1094+
$user = DB::table('users')->where('name', 'John Doe')->first();
1095+
$this->assertEquals(44000, $user->salary);
1096+
$user = DB::table('users')->where('name', 'Jane Doe')->first();
1097+
$this->assertEquals(640000, $user->salary);
1098+
$user = DB::table('users')->where('name', 'Robert Roe')->first();
1099+
$this->assertNull($user->salary);
1100+
$user = DB::table('users')->where('name', 'Mark Moe')->first();
1101+
$this->assertFalse(isset($user->salary));
1102+
}
1103+
10551104
public function testProjections()
10561105
{
10571106
DB::table('items')->insert([

0 commit comments

Comments
 (0)