diff --git a/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php b/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php index 60022736b58d..049f3b294365 100644 --- a/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php +++ b/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php @@ -731,6 +731,10 @@ public function getMorphClass() return array_search(static::class, $morphMap, true); } + if (Relation::$tableNameAsMorphType) { + return $this->getTable(); + } + return static::class; } diff --git a/src/Illuminate/Database/Eloquent/Relations/Relation.php b/src/Illuminate/Database/Eloquent/Relations/Relation.php index 6bdb6f7a7487..ad77b4fb87be 100755 --- a/src/Illuminate/Database/Eloquent/Relations/Relation.php +++ b/src/Illuminate/Database/Eloquent/Relations/Relation.php @@ -55,6 +55,13 @@ abstract class Relation */ public static $morphMap = []; + /** + * Indicates if the morph relation type should default to table name. + * + * @var bool + */ + public static $tableNameAsMorphType = false; + /** * Create a new relation instance. * @@ -341,6 +348,16 @@ public static function morphMap(array $map = null, $merge = true) return static::$morphMap; } + /** + * Changes the default morph type to table name + * + * @return void + */ + public static function tableNameAsMorphType() + { + self::$tableNameAsMorphType = true; + } + /** * Builds a table-keyed array from model class names. * diff --git a/tests/Database/DatabaseEloquentModelTest.php b/tests/Database/DatabaseEloquentModelTest.php index 9884ed69f9a2..da062f99495f 100755 --- a/tests/Database/DatabaseEloquentModelTest.php +++ b/tests/Database/DatabaseEloquentModelTest.php @@ -1200,6 +1200,22 @@ public function testCorrectMorphClassIsReturned() } } + public function testCorrectMorphClassIsReturnedOnChangingDefault() + { + Relation::tableNameAsMorphType(); + Relation::morphMap(['alias' => EloquentModelCamelStub::class]); + Relation::morphMap(['alias2' => 'AnotherModel']); + $model = new EloquentModelStub; + $model2 = new EloquentModelCamelStub; + + try { + $this->assertEquals('stub', $model->getMorphClass()); + $this->assertEquals('alias', $model2->getMorphClass()); + } finally { + Relation::morphMap([], false); + } + } + public function testHasManyCreatesProperRelation() { $model = new EloquentModelStub;