Unverified Commit 4d8fb95d authored by Stas's avatar Stas Committed by GitHub

Merge pull request #2020 from ilyasokay/query-integer-fix

query like on integer fields support
parents a7acac76 aab261b1
...@@ -993,6 +993,7 @@ class Builder extends BaseBuilder ...@@ -993,6 +993,7 @@ class Builder extends BaseBuilder
protected function compileWhereBasic(array $where) protected function compileWhereBasic(array $where)
{ {
extract($where); extract($where);
$is_numeric = false;
// Replace like or not like with a Regex instance. // Replace like or not like with a Regex instance.
if (in_array($operator, ['like', 'not like'])) { if (in_array($operator, ['like', 'not like'])) {
...@@ -1004,15 +1005,21 @@ class Builder extends BaseBuilder ...@@ -1004,15 +1005,21 @@ class Builder extends BaseBuilder
// Convert to regular expression. // 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. // Convert like to regular expression.
if (!Str::startsWith($value, '%')) { if (!Str::startsWith($value, '%')) {
$regex = '^' . $regex; $regex = '^' . $regex;
} else {
$plain_value = Str::replaceFirst('%', null, $plain_value);
} }
if (!Str::endsWith($value, '%')) { if (!Str::endsWith($value, '%')) {
$regex .= '$'; $regex .= '$';
} else {
$plain_value = Str::replaceLast('%', null, $plain_value);
} }
$is_numeric = is_numeric($plain_value);
$value = new Regex($regex, 'i'); $value = new Regex($regex, 'i');
} // Manipulate regexp operations. } // Manipulate regexp operations.
elseif (in_array($operator, ['regexp', 'not regexp', 'regex', 'not regex'])) { elseif (in_array($operator, ['regexp', 'not regexp', 'regex', 'not regex'])) {
...@@ -1032,7 +1039,11 @@ class Builder extends BaseBuilder ...@@ -1032,7 +1039,11 @@ class Builder extends BaseBuilder
} }
if (!isset($operator) || $operator == '=') { if (!isset($operator) || $operator == '=') {
if ($is_numeric) {
$query = ['$where' => '/^'.$value->getPattern().'/.test(this.'.$column.')'];
} else {
$query = [$column => $value]; $query = [$column => $value];
}
} elseif (array_key_exists($operator, $this->conversion)) { } elseif (array_key_exists($operator, $this->conversion)) {
$query = [$column => [$this->conversion[$operator] => $value]]; $query = [$column => [$this->conversion[$operator] => $value]];
} else { } else {
......
...@@ -69,6 +69,15 @@ class QueryTest extends TestCase ...@@ -69,6 +69,15 @@ class QueryTest extends TestCase
$users = User::where('name', 'like', 't%')->get(); $users = User::where('name', 'like', 't%')->get();
$this->assertCount(1, $users); $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 public function testNotLike(): void
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment