diff --git a/src/Illuminate/Database/Eloquent/Model.php b/src/Illuminate/Database/Eloquent/Model.php index 487544dabbc9..b65d7e7cf0ba 100644 --- a/src/Illuminate/Database/Eloquent/Model.php +++ b/src/Illuminate/Database/Eloquent/Model.php @@ -2600,6 +2600,10 @@ public function getAttribute($key) return $this->getAttributeValue($key); } + if (method_exists(self::class, $key)) { + return; + } + return $this->getRelationValue($key); } diff --git a/tests/Database/DatabaseEloquentModelTest.php b/tests/Database/DatabaseEloquentModelTest.php index eb21ba3c55f1..315c31108055 100755 --- a/tests/Database/DatabaseEloquentModelTest.php +++ b/tests/Database/DatabaseEloquentModelTest.php @@ -1376,6 +1376,27 @@ public function testIssetBehavesCorrectlyWithAttributesAndRelationships() $this->assertTrue(isset($model->some_relation)); } + public function testNonExistingAttributeWithInternalMethodNameDoesntCallMethod() + { + $model = m::mock('EloquentModelStub[delete,getRelationValue]'); + $model->name = 'Spark'; + $model->shouldNotReceive('delete'); + $model->shouldReceive('getRelationValue')->once()->with('belongsToStub')->andReturn('relation'); + + // Can return a normal relation + $this->assertEquals('relation', $model->belongsToStub); + + // Can return a normal attribute + $this->assertEquals('Spark', $model->name); + + // Returns null for a Model.php method name + $this->assertNull($model->delete); + + $model = m::mock('EloquentModelStub[delete]'); + $model->delete = 123; + $this->assertEquals(123, $model->delete); + } + public function testIntKeyTypePreserved() { $model = $this->getMockBuilder('EloquentModelStub')->setMethods(['newQueryWithoutScopes', 'updateTimestamps', 'refresh'])->getMock();