diff --git a/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php b/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php index 5262d4305273..993223d1147b 100644 --- a/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php +++ b/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php @@ -731,7 +731,9 @@ public function getMorphClass() return array_search(static::class, $morphMap, true); } - return static::class; + return Relation::$useTableNamesForMorphMap + ? $this->getTable() + : static::class; } /** diff --git a/src/Illuminate/Database/Eloquent/Relations/Relation.php b/src/Illuminate/Database/Eloquent/Relations/Relation.php index 7fe9f3e9fa82..c1e9a482cdc3 100755 --- a/src/Illuminate/Database/Eloquent/Relations/Relation.php +++ b/src/Illuminate/Database/Eloquent/Relations/Relation.php @@ -50,6 +50,13 @@ abstract class Relation */ protected static $constraints = true; + /** + * Indicates that table names should be used when determining morph classes. + * + * @var bool + */ + public static $useTableNamesForMorphMap = false; + /** * An array to map class names to their morph names in the database. * @@ -376,6 +383,16 @@ protected function whereInMethod(Model $model, $key) : 'whereIn'; } + /** + * Indicate that the table names should be used when determining morphed class names. + * + * @return void + */ + public static function morphUsingTableNames() + { + static::$useTableNamesForMorphMap = true; + } + /** * Set or get the morph map for polymorphic relations. * diff --git a/tests/Database/DatabaseEloquentModelTest.php b/tests/Database/DatabaseEloquentModelTest.php index a36bba4fe3eb..88fb3b7de0a9 100755 --- a/tests/Database/DatabaseEloquentModelTest.php +++ b/tests/Database/DatabaseEloquentModelTest.php @@ -1217,6 +1217,16 @@ public function testMorphOneCreatesProperRelation() $this->assertEquals(EloquentModelStub::class, $relation->getMorphClass()); } + public function testMorphOneCreatesProperRelationWhenUsingTableNames() + { + Relation::morphUsingTableNames(); + $model = new EloquentModelStub; + $this->addMockConnection($model); + $relation = $model->morphOne(EloquentModelSaveStub::class, 'morph'); + $this->assertEquals('stub', $relation->getMorphClass()); + Relation::$useTableNamesForMorphMap = false; + } + public function testCorrectMorphClassIsReturned() { Relation::morphMap(['alias' => 'AnotherModel']);