From 336fd3a04e6e2ce5a47d3726b430bf9b58d706f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lyas=20Okay?= Date: Sat, 11 Apr 2020 03:01:54 +0300 Subject: [PATCH 1/2] query like on integer fields support --- src/Jenssegers/Mongodb/Query/Builder.php | 17 ++++++++++++++--- tests/QueryTest.php | 9 +++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/Jenssegers/Mongodb/Query/Builder.php b/src/Jenssegers/Mongodb/Query/Builder.php index 7c5c973ba..f553aa905 100644 --- a/src/Jenssegers/Mongodb/Query/Builder.php +++ b/src/Jenssegers/Mongodb/Query/Builder.php @@ -993,6 +993,7 @@ protected function compileWhereAll(array $where) protected function compileWhereBasic(array $where) { extract($where); + $is_numeric = false; // Replace like or not like with a Regex instance. if (in_array($operator, ['like', 'not like'])) { @@ -1003,17 +1004,23 @@ protected function compileWhereBasic(array $where) } // Convert to regular expression. - $regex = preg_replace('#(^|[^\\\])%#', '$1.*', preg_quote($value)); + $regex = preg_replace('#(^|[^\\\])%#', '$1.*', preg_quote($value)); + $plain_value = $value; // Convert like to regular expression. if (!Str::startsWith($value, '%')) { $regex = '^' . $regex; + } else { + $plain_value = Str::replaceFirst('%', null, $plain_value); } if (!Str::endsWith($value, '%')) { $regex .= '$'; + } else { + $plain_value = Str::replaceLast('%', null, $plain_value); } - $value = new Regex($regex, 'i'); + $is_numeric = is_numeric($plain_value); + $value = new Regex($regex, 'i'); } // Manipulate regexp operations. elseif (in_array($operator, ['regexp', 'not regexp', 'regex', 'not regex'])) { // Automatically convert regular expression strings to Regex objects. @@ -1032,7 +1039,11 @@ protected function compileWhereBasic(array $where) } if (!isset($operator) || $operator == '=') { - $query = [$column => $value]; + if ($is_numeric) { + $query = ['$where' => '/^'.$value->getPattern().'/.test(this.'.$column.')']; + } else { + $query = [$column => $value]; + } } elseif (array_key_exists($operator, $this->conversion)) { $query = [$column => [$this->conversion[$operator] => $value]]; } else { diff --git a/tests/QueryTest.php b/tests/QueryTest.php index ab36d1886..268d7d4d2 100644 --- a/tests/QueryTest.php +++ b/tests/QueryTest.php @@ -69,6 +69,15 @@ public function testLike(): void $users = User::where('name', 'like', 't%')->get(); $this->assertCount(1, $users); + + $users = User::where('age', 'like', '%35%')->get(); + $this->assertCount(3, $users); + + $users = User::where('age', 'like', '3%')->get(); + $this->assertCount(6, $users); + + $users = User::where('age', 'like', '%3')->get(); + $this->assertCount(4, $users); } public function testNotLike(): void From aab261b13a6d666015db02cc318d34018f9c6a6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lyas=20Okay?= Date: Wed, 15 Apr 2020 22:03:49 +0300 Subject: [PATCH 2/2] common style code edit --- src/Jenssegers/Mongodb/Query/Builder.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Jenssegers/Mongodb/Query/Builder.php b/src/Jenssegers/Mongodb/Query/Builder.php index f553aa905..5160915ed 100644 --- a/src/Jenssegers/Mongodb/Query/Builder.php +++ b/src/Jenssegers/Mongodb/Query/Builder.php @@ -1004,8 +1004,8 @@ protected function compileWhereBasic(array $where) } // Convert to regular expression. - $regex = preg_replace('#(^|[^\\\])%#', '$1.*', preg_quote($value)); - $plain_value = $value; + $regex = preg_replace('#(^|[^\\\])%#', '$1.*', preg_quote($value)); + $plain_value = $value; // Convert like to regular expression. if (!Str::startsWith($value, '%')) { @@ -1020,7 +1020,7 @@ protected function compileWhereBasic(array $where) } $is_numeric = is_numeric($plain_value); - $value = new Regex($regex, 'i'); + $value = new Regex($regex, 'i'); } // Manipulate regexp operations. elseif (in_array($operator, ['regexp', 'not regexp', 'regex', 'not regex'])) { // Automatically convert regular expression strings to Regex objects.