Laravel 9指定路径下模型与工厂关联无需设置$model的方法
解决方案
问题根源是Laravel工厂默认的模型推导逻辑,在子目录场景下无法自动匹配到MyApi\v2命名空间下的模型,默认会尝试查找MyApi\Test。以下是两种无需在工厂中手动设置protected $model的实现方式:
方式一:创建V2工厂基类
- 在
database/factories/v2目录下创建基类工厂,指定默认模型命名空间:
// database/factories/v2/BaseV2Factory.php namespace Database\Factories\v2; use Illuminate\Database\Eloquent\Factories\Factory; abstract class BaseV2Factory extends Factory { // 设定v2模型的根命名空间 protected static $namespace = 'MyApi\\v2\\'; }
- 让所有V2工厂继承这个基类,无需再设置
$model属性:
// database/factories/v2/TestFactory.php namespace Database\Factories\v2; use Database\Factories\v2\BaseV2Factory; class TestFactory extends BaseV2Factory { public function definition() { return [ // 你的模型字段定义 ]; } }
方式二:重写模型的工厂解析逻辑
如果不想创建基类,也可以在V2模型中重写HasFactory trait的工厂解析方法,指定对应工厂的命名空间:
// app/v2/Test.php namespace MyApi\v2; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; use Database\Factories\v2\TestFactory; class Test extends Model { use HasFactory; // 重写工厂解析方法,指定对应工厂类 protected static function newFactory() { return TestFactory::new(); } }
注意事项
- 确保执行过
composer dump-autoload,让命名空间映射生效; - 模型和工厂的命名需遵循Laravel约定:模型名为
Test,对应工厂名为TestFactory。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

