Skip to content
This repository was archived by the owner on Aug 22, 2023. It is now read-only.

Commit 34a6085

Browse files
committed
Support _ placeholder for like
1 parent 0c12693 commit 34a6085

File tree

2 files changed

+14
-18
lines changed

2 files changed

+14
-18
lines changed

src/Query/Builder.php

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,24 +1067,15 @@ protected function compileWhereBasic(array $where): array
10671067

10681068
// Replace like with a Regex instance.
10691069
if (in_array($operator, ['like', 'not like'])) {
1070-
if (str_starts_with($operator, 'not')) {
1071-
$operator = 'not';
1072-
} else {
1070+
if ($operator === 'like') {
10731071
$operator = '=';
1072+
} else {
1073+
$operator = 'not';
10741074
}
10751075

10761076
// Convert to regular expression.
1077-
$regex = preg_replace('#(^|[^\\\])%#', '$1.*', preg_quote($value));
1078-
1079-
// Convert like to regular expression.
1080-
if (! str_starts_with($value, '%')) {
1081-
$regex = '^'.$regex;
1082-
}
1083-
if (! str_ends_with($value, '%')) {
1084-
$regex .= '$';
1085-
}
1086-
1087-
$value = new Regex($regex, 'i');
1077+
$regex = preg_replace(['#(^|[^\\\])%#', '#(^|[^\\\])_#'], ['$1.*', '$1.'], preg_quote($value));
1078+
$value = new Regex('^'.$regex.'$', 'i');
10881079
} // Manipulate regex operations.
10891080
elseif (in_array($operator, ['regex', 'not regex'])) {
10901081
// Automatically convert regular expression strings to Regex objects.

tests/Query/BuilderTest.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -446,13 +446,18 @@ function (Builder $builder) {
446446
];
447447

448448
yield 'where like escape' => [
449-
['find' => [['name' => new Regex('^\^acme\$$', 'i')], []]],
450-
fn (Builder $builder) => $builder->where('name', 'like', '^acme$'),
449+
['find' => [['name' => new Regex('^\^ac\.me\$$', 'i')], []]],
450+
fn (Builder $builder) => $builder->where('name', 'like', '^ac.me$'),
451451
];
452452

453453
yield 'where like %' => [
454-
['find' => [['name' => new Regex('.*acme.*', 'i')], []]],
455-
fn (Builder $builder) => $builder->where('name', 'like', '%acme%'),
454+
['find' => [['name' => new Regex('^.*ac.*me.*$', 'i')], []]],
455+
fn (Builder $builder) => $builder->where('name', 'like', '%ac%me%'),
456+
];
457+
458+
yield 'where like _' => [
459+
['find' => [['name' => new Regex('^.ac.me.$', 'i')], []]],
460+
fn (Builder $builder) => $builder->where('name', 'like', '_ac_me_'),
456461
];
457462

458463
$regex = new Regex('^acme$', 'si');

0 commit comments

Comments
 (0)