Skip to content

Commit 4d8fb95

Browse files
authored
Merge pull request mongodb#2020 from ilyasokay/query-integer-fix
query like on integer fields support
2 parents a7acac7 + aab261b commit 4d8fb95

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

src/Jenssegers/Mongodb/Query/Builder.php

+12-1
Original file line numberDiff line numberDiff line change
@@ -993,6 +993,7 @@ protected function compileWhereAll(array $where)
993993
protected function compileWhereBasic(array $where)
994994
{
995995
extract($where);
996+
$is_numeric = false;
996997

997998
// Replace like or not like with a Regex instance.
998999
if (in_array($operator, ['like', 'not like'])) {
@@ -1004,15 +1005,21 @@ protected function compileWhereBasic(array $where)
10041005

10051006
// Convert to regular expression.
10061007
$regex = preg_replace('#(^|[^\\\])%#', '$1.*', preg_quote($value));
1008+
$plain_value = $value;
10071009

10081010
// Convert like to regular expression.
10091011
if (!Str::startsWith($value, '%')) {
10101012
$regex = '^' . $regex;
1013+
} else {
1014+
$plain_value = Str::replaceFirst('%', null, $plain_value);
10111015
}
10121016
if (!Str::endsWith($value, '%')) {
10131017
$regex .= '$';
1018+
} else {
1019+
$plain_value = Str::replaceLast('%', null, $plain_value);
10141020
}
10151021

1022+
$is_numeric = is_numeric($plain_value);
10161023
$value = new Regex($regex, 'i');
10171024
} // Manipulate regexp operations.
10181025
elseif (in_array($operator, ['regexp', 'not regexp', 'regex', 'not regex'])) {
@@ -1032,7 +1039,11 @@ protected function compileWhereBasic(array $where)
10321039
}
10331040

10341041
if (!isset($operator) || $operator == '=') {
1035-
$query = [$column => $value];
1042+
if ($is_numeric) {
1043+
$query = ['$where' => '/^'.$value->getPattern().'/.test(this.'.$column.')'];
1044+
} else {
1045+
$query = [$column => $value];
1046+
}
10361047
} elseif (array_key_exists($operator, $this->conversion)) {
10371048
$query = [$column => [$this->conversion[$operator] => $value]];
10381049
} else {

tests/QueryTest.php

+9
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,15 @@ public function testLike(): void
6969

7070
$users = User::where('name', 'like', 't%')->get();
7171
$this->assertCount(1, $users);
72+
73+
$users = User::where('age', 'like', '%35%')->get();
74+
$this->assertCount(3, $users);
75+
76+
$users = User::where('age', 'like', '3%')->get();
77+
$this->assertCount(6, $users);
78+
79+
$users = User::where('age', 'like', '%3')->get();
80+
$this->assertCount(4, $users);
7281
}
7382

7483
public function testNotLike(): void

0 commit comments

Comments
 (0)