Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit e2b119a

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /