diff --git a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php index 31564c1f56a8..5718281edee8 100644 --- a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php +++ b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php @@ -569,8 +569,14 @@ public function isRelation($key) return false; } - return method_exists($this, $key) || - $this->relationResolver(static::class, $key); + if (method_exists($this, $key)) { + $methodReturnType = (new ReflectionMethod($this, $key))->getReturnType()?->getName(); + if (is_subclass_of($methodReturnType, Relation::class)) { + return true; + } + } + + return !!$this->relationResolver(static::class, $key); } /** diff --git a/tests/Database/DatabaseEloquentDynamicRelationsTest.php b/tests/Database/DatabaseEloquentNoRelationsTest.php similarity index 94% rename from tests/Database/DatabaseEloquentDynamicRelationsTest.php rename to tests/Database/DatabaseEloquentNoRelationsTest.php index 346f00fa2297..e479f42ba273 100644 --- a/tests/Database/DatabaseEloquentDynamicRelationsTest.php +++ b/tests/Database/DatabaseEloquentNoRelationsTest.php @@ -71,6 +71,16 @@ public function testDynamicRelationsCanNotHaveTheSameNameAsNormalRelations() $this->assertTrue($model->isRelation('hardCodedRelation')); } + public function testNotDetectRegularFunctionAsRelation() + { + $model = new NoRelationModel; + + if (!isset($model->comment)) { + $model->comment(); + } + $this->assertTrue(true); + } + public function testRelationResolvers() { $model1 = new DynamicRelationModel; @@ -137,3 +147,9 @@ public function getResults() return ['many' => 'related']; } } + +class NoRelationModel extends Model +{ + public function comment(): void + {} +}