1414use PHPStan \Type \ObjectType ;
1515use Rector \Contract \Rector \ConfigurableRectorInterface ;
1616use Rector \Rector \AbstractRector ;
17+ use Symplify \RuleDocGenerator \ValueObject \CodeSample \ConfiguredCodeSample ;
1718use Symplify \RuleDocGenerator \ValueObject \RuleDefinition ;
1819use 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