From c7e8563cc6c6aa3f6f0a3316d5bed8b2c7ca846b Mon Sep 17 00:00:00 2001 From: faissaloux Date: Sat, 26 Apr 2025 22:04:59 +0100 Subject: [PATCH 1/6] [QueryBuilder] multiply support --- src/Query/Builder.php | 21 +++++++++++++++++++++ tests/QueryBuilderTest.php | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/src/Query/Builder.php b/src/Query/Builder.php index 6823998fd..542089593 100644 --- a/src/Query/Builder.php +++ b/src/Query/Builder.php @@ -890,6 +890,27 @@ public function decrementEach(array $columns, array $extra = [], array $options return $this->incrementEach($decrement, $extra, $options); } + /** @inheritdoc */ + public function multiply($column, $amount = 1, array $extra = [], array $options = []) + { + $query = ['$mul' => [(string) $column => $amount]]; + + if (! empty($extra)) { + $query['$set'] = $extra; + } + + // Protect + $this->where(function ($query) use ($column) { + $query->where($column, 'exists', false); + + $query->orWhereNotNull($column); + }); + + $options = $this->inheritConnectionOptions($options); + + return $this->performUpdate($query, $options); + } + /** @inheritdoc */ public function pluck($column, $key = null) { diff --git a/tests/QueryBuilderTest.php b/tests/QueryBuilderTest.php index 1233cda75..3f7fb0ae7 100644 --- a/tests/QueryBuilderTest.php +++ b/tests/QueryBuilderTest.php @@ -1052,6 +1052,42 @@ public function testIncrement() $this->assertEquals(1, $user->age); } + public function testMultiply() + { + DB::table('users')->insert([ + ['name' => 'John Doe', 'salary' => 3000, 'note' => 'adult'], + ['name' => 'Jane Doe', 'salary' => 1000, 'note' => 'minor'], + ['name' => 'Robert Roe', 'salary' => null], + ['name' => 'Mark Moe'], + ]); + + $user = DB::table('users')->where('name', 'John Doe')->first(); + $this->assertEquals(3000, $user->salary); + + DB::table('users')->where('name', 'John Doe')->multiply('salary'); + $user = DB::table('users')->where('name', 'John Doe')->first(); + $this->assertEquals(3000, $user->salary); + + DB::table('users')->where('name', 'John Doe')->multiply('salary', 2); + $user = DB::table('users')->where('name', 'John Doe')->first(); + $this->assertEquals(6000, $user->salary); + + DB::table('users')->where('name', 'Jane Doe')->multiply('salary', 10, ['note' => 'adult']); + $user = DB::table('users')->where('name', 'Jane Doe')->first(); + $this->assertEquals(10000, $user->salary); + $this->assertEquals('adult', $user->note); + + DB::table('users')->multiply('salary'); + $user = DB::table('users')->where('name', 'John Doe')->first(); + $this->assertEquals(6000, $user->salary); + $user = DB::table('users')->where('name', 'Jane Doe')->first(); + $this->assertEquals(10000, $user->salary); + $user = DB::table('users')->where('name', 'Robert Roe')->first(); + $this->assertNull($user->salary); + $user = DB::table('users')->where('name', 'Mark Moe')->first(); + $this->assertEquals(0, $user->salary); + } + public function testProjections() { DB::table('items')->insert([ From d8d130832861b1985bad7761f15c5be187390bf5 Mon Sep 17 00:00:00 2001 From: faissaloux Date: Sat, 26 Apr 2025 22:18:39 +0100 Subject: [PATCH 2/6] [QueryBuilder] divide support --- src/Query/Builder.php | 6 ++++++ tests/QueryBuilderTest.php | 35 ++++++++++++++++++++++++----------- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/Query/Builder.php b/src/Query/Builder.php index 542089593..f44ff6702 100644 --- a/src/Query/Builder.php +++ b/src/Query/Builder.php @@ -911,6 +911,12 @@ public function multiply($column, $amount = 1, array $extra = [], array $options return $this->performUpdate($query, $options); } + /** @inheritdoc */ + public function divide($column, $amount = 1, array $extra = [], array $options = []) + { + return $this->multiply($column, 1 / $amount, $extra, $options); + } + /** @inheritdoc */ public function pluck($column, $key = null) { diff --git a/tests/QueryBuilderTest.php b/tests/QueryBuilderTest.php index 3f7fb0ae7..48b17ce5e 100644 --- a/tests/QueryBuilderTest.php +++ b/tests/QueryBuilderTest.php @@ -1052,36 +1052,49 @@ public function testIncrement() $this->assertEquals(1, $user->age); } - public function testMultiply() + public function testMultiplyAndDivide() { DB::table('users')->insert([ - ['name' => 'John Doe', 'salary' => 3000, 'note' => 'adult'], - ['name' => 'Jane Doe', 'salary' => 1000, 'note' => 'minor'], + ['name' => 'John Doe', 'salary' => 88000, 'note' => 'senior'], + ['name' => 'Jane Doe', 'salary' => 64000, 'note' => 'junior'], ['name' => 'Robert Roe', 'salary' => null], ['name' => 'Mark Moe'], ]); $user = DB::table('users')->where('name', 'John Doe')->first(); - $this->assertEquals(3000, $user->salary); + $this->assertEquals(88000, $user->salary); DB::table('users')->where('name', 'John Doe')->multiply('salary'); $user = DB::table('users')->where('name', 'John Doe')->first(); - $this->assertEquals(3000, $user->salary); + $this->assertEquals(88000, $user->salary); + + DB::table('users')->where('name', 'John Doe')->divide('salary'); + $user = DB::table('users')->where('name', 'John Doe')->first(); + $this->assertEquals(88000, $user->salary); DB::table('users')->where('name', 'John Doe')->multiply('salary', 2); $user = DB::table('users')->where('name', 'John Doe')->first(); - $this->assertEquals(6000, $user->salary); + $this->assertEquals(176000, $user->salary); + + DB::table('users')->where('name', 'John Doe')->divide('salary', 2); + $user = DB::table('users')->where('name', 'John Doe')->first(); + $this->assertEquals(88000, $user->salary); - DB::table('users')->where('name', 'Jane Doe')->multiply('salary', 10, ['note' => 'adult']); + DB::table('users')->where('name', 'Jane Doe')->multiply('salary', 10, ['note' => 'senior']); $user = DB::table('users')->where('name', 'Jane Doe')->first(); - $this->assertEquals(10000, $user->salary); - $this->assertEquals('adult', $user->note); + $this->assertEquals(640000, $user->salary); + $this->assertEquals('senior', $user->note); + + DB::table('users')->where('name', 'John Doe')->divide('salary', 2, ['note' => 'junior']); + $user = DB::table('users')->where('name', 'John Doe')->first(); + $this->assertEquals(44000, $user->salary); + $this->assertEquals('junior', $user->note); DB::table('users')->multiply('salary'); $user = DB::table('users')->where('name', 'John Doe')->first(); - $this->assertEquals(6000, $user->salary); + $this->assertEquals(44000, $user->salary); $user = DB::table('users')->where('name', 'Jane Doe')->first(); - $this->assertEquals(10000, $user->salary); + $this->assertEquals(640000, $user->salary); $user = DB::table('users')->where('name', 'Robert Roe')->first(); $this->assertNull($user->salary); $user = DB::table('users')->where('name', 'Mark Moe')->first(); From d2c75f06bc9a24f8177243b7ad046e5d3ef91f88 Mon Sep 17 00:00:00 2001 From: faissaloux Date: Wed, 30 Apr 2025 22:14:05 +0100 Subject: [PATCH 3/6] update PHPDocs --- src/Query/Builder.php | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Query/Builder.php b/src/Query/Builder.php index f44ff6702..1f7dad751 100644 --- a/src/Query/Builder.php +++ b/src/Query/Builder.php @@ -890,7 +890,13 @@ public function decrementEach(array $columns, array $extra = [], array $options return $this->incrementEach($decrement, $extra, $options); } - /** @inheritdoc */ + /** + * Multiply a column's value by a given amount. + * + * @param string $column + * @param float|int $amount + * @return int + */ public function multiply($column, $amount = 1, array $extra = [], array $options = []) { $query = ['$mul' => [(string) $column => $amount]]; @@ -911,7 +917,13 @@ public function multiply($column, $amount = 1, array $extra = [], array $options return $this->performUpdate($query, $options); } - /** @inheritdoc */ + /** + * Divide a column's value by a given amount. + * + * @param string $column + * @param float|int $amount + * @return int + */ public function divide($column, $amount = 1, array $extra = [], array $options = []) { return $this->multiply($column, 1 / $amount, $extra, $options); From 87b0d4818e2225f38c5d6a40cdcc210eafb977e9 Mon Sep 17 00:00:00 2001 From: faissaloux Date: Fri, 23 May 2025 14:59:05 +0100 Subject: [PATCH 4/6] remove default value --- src/Query/Builder.php | 4 ++-- tests/QueryBuilderTest.php | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Query/Builder.php b/src/Query/Builder.php index 1f7dad751..2b397d25d 100644 --- a/src/Query/Builder.php +++ b/src/Query/Builder.php @@ -897,7 +897,7 @@ public function decrementEach(array $columns, array $extra = [], array $options * @param float|int $amount * @return int */ - public function multiply($column, $amount = 1, array $extra = [], array $options = []) + public function multiply($column, $amount, array $extra = [], array $options = []) { $query = ['$mul' => [(string) $column => $amount]]; @@ -924,7 +924,7 @@ public function multiply($column, $amount = 1, array $extra = [], array $options * @param float|int $amount * @return int */ - public function divide($column, $amount = 1, array $extra = [], array $options = []) + public function divide($column, $amount, array $extra = [], array $options = []) { return $this->multiply($column, 1 / $amount, $extra, $options); } diff --git a/tests/QueryBuilderTest.php b/tests/QueryBuilderTest.php index 48b17ce5e..7906b2abb 100644 --- a/tests/QueryBuilderTest.php +++ b/tests/QueryBuilderTest.php @@ -1064,11 +1064,11 @@ public function testMultiplyAndDivide() $user = DB::table('users')->where('name', 'John Doe')->first(); $this->assertEquals(88000, $user->salary); - DB::table('users')->where('name', 'John Doe')->multiply('salary'); + DB::table('users')->where('name', 'John Doe')->multiply('salary', 1); $user = DB::table('users')->where('name', 'John Doe')->first(); $this->assertEquals(88000, $user->salary); - DB::table('users')->where('name', 'John Doe')->divide('salary'); + DB::table('users')->where('name', 'John Doe')->divide('salary', 1); $user = DB::table('users')->where('name', 'John Doe')->first(); $this->assertEquals(88000, $user->salary); @@ -1090,7 +1090,7 @@ public function testMultiplyAndDivide() $this->assertEquals(44000, $user->salary); $this->assertEquals('junior', $user->note); - DB::table('users')->multiply('salary'); + DB::table('users')->multiply('salary', 1); $user = DB::table('users')->where('name', 'John Doe')->first(); $this->assertEquals(44000, $user->salary); $user = DB::table('users')->where('name', 'Jane Doe')->first(); From 60c6487f440bac3890d185224f201112ef9a314d Mon Sep 17 00:00:00 2001 From: faissaloux Date: Fri, 23 May 2025 15:26:54 +0100 Subject: [PATCH 5/6] don't create field when not exist --- src/Query/Builder.php | 4 ++-- tests/QueryBuilderTest.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Query/Builder.php b/src/Query/Builder.php index 2b397d25d..d3a6740fe 100644 --- a/src/Query/Builder.php +++ b/src/Query/Builder.php @@ -907,9 +907,9 @@ public function multiply($column, $amount, array $extra = [], array $options = [ // Protect $this->where(function ($query) use ($column) { - $query->where($column, 'exists', false); + $query->where($column, 'exists', true); - $query->orWhereNotNull($column); + $query->whereNotNull($column); }); $options = $this->inheritConnectionOptions($options); diff --git a/tests/QueryBuilderTest.php b/tests/QueryBuilderTest.php index 7906b2abb..5c52b9003 100644 --- a/tests/QueryBuilderTest.php +++ b/tests/QueryBuilderTest.php @@ -1098,7 +1098,7 @@ public function testMultiplyAndDivide() $user = DB::table('users')->where('name', 'Robert Roe')->first(); $this->assertNull($user->salary); $user = DB::table('users')->where('name', 'Mark Moe')->first(); - $this->assertEquals(0, $user->salary); + $this->assertFalse(isset($user->salary)); } public function testProjections() From 776f552b71eb4dcce2a32b43b7c532e1eb207cbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Tamarelle?= Date: Tue, 10 Jun 2025 09:52:20 +0200 Subject: [PATCH 6/6] Fix CS --- src/Query/Builder.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Query/Builder.php b/src/Query/Builder.php index d3a6740fe..d84480006 100644 --- a/src/Query/Builder.php +++ b/src/Query/Builder.php @@ -893,8 +893,9 @@ public function decrementEach(array $columns, array $extra = [], array $options /** * Multiply a column's value by a given amount. * - * @param string $column - * @param float|int $amount + * @param string $column + * @param float|int $amount + * * @return int */ public function multiply($column, $amount, array $extra = [], array $options = []) @@ -920,8 +921,9 @@ public function multiply($column, $amount, array $extra = [], array $options = [ /** * Divide a column's value by a given amount. * - * @param string $column - * @param float|int $amount + * @param string $column + * @param float|int $amount + * * @return int */ public function divide($column, $amount, array $extra = [], array $options = [])