Skip to content

Commit 6769988

Browse files
committed
Update docs and fix errors
1 parent d65680e commit 6769988

File tree

2 files changed

+88
-22
lines changed

2 files changed

+88
-22
lines changed

docs/rector_rules_overview.md

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# 70 Rules Overview
1+
# 72 Rules Overview
22

33
## AbortIfRector
44

@@ -1422,3 +1422,33 @@ Convert string validation rules into arrays for Laravel's Validator.
14221422
```
14231423

14241424
<br>
1425+
1426+
## WhereToWhereLikeRector
1427+
1428+
Changes `where` method calls to `whereLike` method calls in the Eloquent & Query Builder
1429+
1430+
:wrench: **configure it!**
1431+
1432+
- class: [`RectorLaravel\Rector\MethodCall\WhereToWhereLikeRector`](../src/Rector/MethodCall/WhereToWhereLikeRector.php)
1433+
1434+
```diff
1435+
-$query->where('name', 'like', 'Rector');
1436+
-$query->orWhere('name', 'like', 'Rector');
1437+
-$query->where('name', 'like binary', 'Rector');
1438+
+$query->whereLike('name', 'Rector');
1439+
+$query->orWhereLike('name', 'Rector');
1440+
+$query->whereLike('name', 'Rector', true);
1441+
```
1442+
1443+
<br>
1444+
1445+
```diff
1446+
-$query->where('name', 'ilike', 'Rector');
1447+
-$query->orWhere('name', 'ilike', 'Rector');
1448+
-$query->where('name', 'like', 'Rector');
1449+
+$query->whereLike('name', 'Rector');
1450+
+$query->orWhereLike('name', 'Rector');
1451+
+$query->whereLike('name', 'Rector', true);
1452+
```
1453+
1454+
<br>

src/Rector/MethodCall/WhereToWhereLikeRector.php

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@
1414
use PHPStan\Type\ObjectType;
1515
use Rector\Contract\Rector\ConfigurableRectorInterface;
1616
use Rector\Rector\AbstractRector;
17+
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
1718
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
1819
use Webmozart\Assert\Assert;
1920

2021
/**
2122
* @see https://github.com/laravel/framework/pull/52147
22-
*
2323
* @see \RectorLaravel\Tests\Rector\MethodCall\WhereToWhereLikeRector\WhereToWhereLikeRectorTest
2424
* @see \RectorLaravel\Tests\Rector\MethodCall\WhereToWhereLikeRector\WhereToWhereLikeRectorPostgresTest
2525
*/
@@ -35,10 +35,38 @@ final class WhereToWhereLikeRector extends AbstractRector implements Configurabl
3535
public function getRuleDefinition(): RuleDefinition
3636
{
3737
return new RuleDefinition(
38-
'Changes `where` method call to `whereLike` method call in Laravel Query Builder',
39-
[
40-
]
41-
);
38+
'Changes `where` method calls to `whereLike` method calls in the Eloquent & Query Builder', [
39+
new ConfiguredCodeSample(
40+
<<<'CODE_SAMPLE'
41+
$query->where('name', 'like', 'Rector');
42+
$query->orWhere('name', 'like', 'Rector');
43+
$query->where('name', 'like binary', 'Rector');
44+
CODE_SAMPLE
45+
,
46+
<<<'CODE_SAMPLE'
47+
$query->whereLike('name', 'Rector');
48+
$query->orWhereLike('name', 'Rector');
49+
$query->whereLike('name', 'Rector', true);
50+
CODE_SAMPLE
51+
,
52+
['usingPostgresDriver' => false]
53+
),
54+
new ConfiguredCodeSample(
55+
<<<'CODE_SAMPLE'
56+
$query->where('name', 'ilike', 'Rector');
57+
$query->orWhere('name', 'ilike', 'Rector');
58+
$query->where('name', 'like', 'Rector');
59+
CODE_SAMPLE
60+
,
61+
<<<'CODE_SAMPLE'
62+
$query->whereLike('name', 'Rector');
63+
$query->orWhereLike('name', 'Rector');
64+
$query->whereLike('name', 'Rector', true);
65+
CODE_SAMPLE
66+
,
67+
['usingPostgresDriver' => true]
68+
),
69+
]);
4270
}
4371

4472
/**
@@ -58,7 +86,7 @@ public function refactor(Node $node): ?Node
5886
return null;
5987
}
6088

61-
if (!in_array(strtolower((string) $this->getName($node->name)), array_keys(self::WHERE_LIKE_METHODS))) {
89+
if (! in_array($this->getLowercaseMethodCallName($node), array_keys(self::WHERE_LIKE_METHODS), true)) {
6290
return null;
6391
}
6492

@@ -68,7 +96,7 @@ public function refactor(Node $node): ?Node
6896

6997
$likeParameter = $this->getLikeParameterUsedInQuery($node);
7098

71-
if (!in_array($likeParameter, ['like', 'like binary', 'ilike', 'not like', 'not like binary', 'not ilike'])) {
99+
if (! in_array($likeParameter, ['like', 'like binary', 'ilike', 'not like', 'not like binary', 'not ilike'], true)) {
72100
return null;
73101
}
74102

@@ -86,6 +114,7 @@ public function configure(array $configuration): void
86114
{
87115
if ($configuration === []) {
88116
$this->usingPostgresDriver = false;
117+
89118
return;
90119
}
91120

@@ -95,42 +124,46 @@ public function configure(array $configuration): void
95124
$this->usingPostgresDriver = $configuration['usingPostgresDriver'];
96125
}
97126

98-
private function getLikeParameterUsedInQuery(MethodCall $node): ?string
127+
private function getLikeParameterUsedInQuery(MethodCall $methodCall): ?string
99128
{
100-
if (! $node->args[1]->value instanceof String_) {
129+
if (! $methodCall->args[1] instanceof Arg) {
130+
return null;
131+
}
132+
133+
if (! $methodCall->args[1]->value instanceof String_) {
101134
return null;
102135
}
103136

104-
return strtolower($node->args[1]->value->value);
137+
return strtolower($methodCall->args[1]->value->value);
105138
}
106139

107-
private function setNewNodeName(MethodCall $node, string $likeParameter): void
140+
private function setNewNodeName(MethodCall $methodCall, string $likeParameter): void
108141
{
109-
$newNodeName = self::WHERE_LIKE_METHODS[$node->name->toLowerString()];
142+
$newNodeName = self::WHERE_LIKE_METHODS[$this->getLowercaseMethodCallName($methodCall)];
110143

111144
if (str_contains($likeParameter, 'not')) {
112145
$newNodeName = str_replace('Like', 'NotLike', $newNodeName);
113146
}
114147

115-
$node->name = new Identifier($newNodeName);
148+
$methodCall->name = new Identifier($newNodeName);
116149
}
117150

118-
private function setCaseSensitivity(MethodCall $node, string $likeParameter): void
151+
private function setCaseSensitivity(MethodCall $methodCall, string $likeParameter): void
119152
{
120153
// Case sensitive query in MySQL
121-
if (in_array($likeParameter, ['like binary', 'not like binary'])) {
122-
$node->args[] = $this->getCaseSensitivityArgument($node);
154+
if (in_array($likeParameter, ['like binary', 'not like binary'], true)) {
155+
$methodCall->args[] = $this->getCaseSensitivityArgument($methodCall);
123156
}
124157

125158
// Case sensitive query in Postgres
126-
if ($this->usingPostgresDriver && in_array($likeParameter, ['like', 'not like'])) {
127-
$node->args[] = $this->getCaseSensitivityArgument($node);
159+
if ($this->usingPostgresDriver && in_array($likeParameter, ['like', 'not like'], true)) {
160+
$methodCall->args[] = $this->getCaseSensitivityArgument($methodCall);
128161
}
129162
}
130163

131-
private function getCaseSensitivityArgument(MethodCall $node): Arg
164+
private function getCaseSensitivityArgument(MethodCall $methodCall): Arg
132165
{
133-
if ($node->args[2]->name !== null) {
166+
if ($methodCall->args[2] instanceof Arg && $methodCall->args[2]->name !== null) {
134167
return new Arg(
135168
new ConstFetch(new Name('true')),
136169
name: new Identifier('caseSensitive')
@@ -140,5 +173,8 @@ private function getCaseSensitivityArgument(MethodCall $node): Arg
140173
return new Arg(new ConstFetch(new Name('true')));
141174
}
142175

143-
176+
private function getLowercaseMethodCallName(MethodCall $methodCall): string
177+
{
178+
return strtolower((string) $this->getName($methodCall->name));
179+
}
144180
}

0 commit comments

Comments
 (0)