Skip to content

Commit 4b2c2c0

Browse files
authored
fix: check for generic class and parent type (#217)
1 parent d0968c0 commit 4b2c2c0

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

src/Rules/NoDynamicWhereRule.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,17 @@ private function findModel(ClassReflection $calledOnReflection): string|null
155155
$calledOnReflection->getName() === EloquentBuilder::class ||
156156
$calledOnReflection->isSubclassOf(EloquentBuilder::class)
157157
) {
158-
$modelType = $calledOnReflection->getActiveTemplateTypeMap()->getType('TModelClass');
158+
if ($calledOnReflection->isGeneric()) {
159+
$modelType = $calledOnReflection->getActiveTemplateTypeMap()->getType('TModelClass') ??
160+
$calledOnReflection->getActiveTemplateTypeMap()->getType('TModel');
161+
} elseif ($calledOnReflection->getParentClass() !== null) {
162+
$parent = $calledOnReflection->getParentClass();
163+
164+
$modelType = $parent->getActiveTemplateTypeMap()->getType('TModelClass') ??
165+
$parent->getActiveTemplateTypeMap()->getType('TModel');
166+
} else {
167+
$modelType = null;
168+
}
159169

160170
if (! $modelType instanceof ObjectType) {
161171
return null;

tests/Rules/data/dynamic-where.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,28 @@ public function hasActiveActions(): bool
143143
return $this->actions()->whereIsActive()->exists();
144144
}
145145

146-
//return $this->actions()->whereActive()->exists();
146+
return $this->actions()->whereActive()->exists();
147147
}
148148
}
149149

150150
class AccountAction extends Model
151151
{
152+
/**
153+
* @param Builder<AccountAction> $query
154+
*
155+
* @return Builder<AccountAction>
156+
*/
152157
public function scopeWhereActive(Builder $query): Builder
153158
{
154159
return $query->where('is_active', true);
155160
}
156161
}
162+
163+
/** @extends Builder<AccountAction> */
164+
class SomeBuilder extends Builder
165+
{
166+
public function doFoo(): void
167+
{
168+
$this->whereActive();
169+
}
170+
}

0 commit comments

Comments
 (0)