Php 使用自定义创建方法的Laravel工厂

Php 使用自定义创建方法的Laravel工厂,php,laravel,Php,Laravel,我在我的一些模型上覆盖了create方法,如中。我发现的问题是,这些模型的工厂失败了,因为它们没有调用我的自定义create方法 型号代码: 班主任扩展模型{ 公共静态函数创建(数组$attributes) { $user=user::创建(['name'=>$attributes['name']); 返回static::query()->create(['budget'=>$attributes['budget','user\u id'=>$user->id]); } 工厂代码: $fact

我在我的一些模型上覆盖了
create
方法,如中。我发现的问题是,这些模型的工厂失败了,因为它们没有调用我的自定义
create
方法

型号代码:

班主任扩展模型{
公共静态函数创建(数组$attributes)
{
$user=user::创建(['name'=>$attributes['name']);
返回static::query()->create(['budget'=>$attributes['budget','user\u id'=>$user->id]);
}
工厂代码:

$factory->define(App\Teacher::类,函数(Faker$Faker){
返回[
'name'=>$faker->firstName(),
“预算”=>$faker->数字之间(1001000)
];
}
我得到以下错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'name' in 'field list' (SQL: insert into `teachers` (`name`, `budget`, `updated_at`, `created_at`) values (Audreanne, 600, 2020-04-07 16:43:54, 2020-04-07 16:43:54))

非常感谢您的帮助!

回答

工厂不使用模型创建方法来创建模型,而是使用
save
方法。您应该将工厂更改为如下所示:

$factory->define(App\Teacher::class, function(Faker $faker) {
  return [
    'user_id' => function () {
        return factory(App\User::class)->create()->id;
    },
    'budget' => $faker->numberBetween(100, 1000)
  ];
});
您应该已经有了一个
UserFactory.php
,它将为关联的用户生成一个名称

附加建议

至于覆盖模型上的create函数,我强烈建议不要使用这种方法。

在代码中创建
教师的地方,我建议您采用以下方法:

// For example in TeacherController::store
$budget = 500;
$user_id = User::create(['name' => 'Peter Griffin'])->id;
$teacher = Teacher::create(compact('budget', 'user_id'));
如果您发现需要在多个位置执行此代码,那么我建议在您的模型上实现一个新方法(请参见下文)或创建一个服务类来处理它:

class Teacher extends Model {
    public static function createWithUser($name, $budget): Teacher
    {
        $user_id = User::create(compact('name'))->id;
        return Teacher::create(compact('budget', 'user_id'));          
    }
}

// For example
$teacher = Teacher::createWithUser('Peter Griffin', 500);

budget
列似乎不存在于您的
teachers
表中。您确定您已经迁移了它吗?@Purgatory Ahh我犯了一个错误。我编辑了错误。感谢您的洞察力。我同意,覆盖模型方法看起来有点混乱。谢谢