diff --git a/src/Illuminate/Database/Eloquent/Factories/Factory.php b/src/Illuminate/Database/Eloquent/Factories/Factory.php index 9bdce1c7456..bf56720c2b0 100644 --- a/src/Illuminate/Database/Eloquent/Factories/Factory.php +++ b/src/Illuminate/Database/Eloquent/Factories/Factory.php @@ -675,12 +675,16 @@ public function newModel(array $attributes = []) public function modelName() { $resolver = static::$modelNameResolver ?: function (self $factory) { + $namespacedFactoryBasename = Str::replaceLast( + 'Factory', '', Str::replaceFirst(static::$namespace, '', get_class($factory)) + ); + $factoryBasename = Str::replaceLast('Factory', '', class_basename($factory)); $appNamespace = static::appNamespace(); - return class_exists($appNamespace.'Models\\'.$factoryBasename) - ? $appNamespace.'Models\\'.$factoryBasename + return class_exists($appNamespace.'Models\\'.$namespacedFactoryBasename) + ? $appNamespace.'Models\\'.$namespacedFactoryBasename : $appNamespace.$factoryBasename; }; diff --git a/tests/Database/DatabaseEloquentFactoryTest.php b/tests/Database/DatabaseEloquentFactoryTest.php index f30276d06ff..53bc1184791 100644 --- a/tests/Database/DatabaseEloquentFactoryTest.php +++ b/tests/Database/DatabaseEloquentFactoryTest.php @@ -11,6 +11,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\Sequence; use Illuminate\Database\Eloquent\Model as Eloquent; +use Illuminate\Tests\Database\Fixtures\Models\Money\Price; use Mockery; use PHPUnit\Framework\TestCase; @@ -429,6 +430,18 @@ public function test_resolve_nested_model_factories() } } + public function test_resolve_nested_model_name_from_factory() + { + Container::getInstance()->instance(Application::class, $app = Mockery::mock(Application::class)); + $app->shouldReceive('getNamespace')->andReturn('Illuminate\\Tests\\Database\\Fixtures\\'); + + Factory::useNamespace('Illuminate\\Tests\\Database\\Fixtures\\Factories\\'); + + $factory = Price::factory(); + + $this->assertSame(Price::class, $factory->modelName()); + } + public function test_resolve_non_app_nested_model_factories() { Container::getInstance()->instance(Application::class, $app = Mockery::mock(Application::class)); diff --git a/tests/Database/Fixtures/Factories/Money/PriceFactory.php b/tests/Database/Fixtures/Factories/Money/PriceFactory.php new file mode 100644 index 00000000000..bf49e8be217 --- /dev/null +++ b/tests/Database/Fixtures/Factories/Money/PriceFactory.php @@ -0,0 +1,15 @@ + $this->faker->name, + ]; + } +} diff --git a/tests/Database/Fixtures/Models/Money/Price.php b/tests/Database/Fixtures/Models/Money/Price.php new file mode 100644 index 00000000000..7fd74460736 --- /dev/null +++ b/tests/Database/Fixtures/Models/Money/Price.php @@ -0,0 +1,19 @@ +