Laravel工厂填充一对多关系时字段无默认值问题及关联填充需求
解决Laravel工厂填充关联模型时的“Field doesn't have default value”错误
这个错误的核心原因是procedures表的speciality_id字段没有默认值,且你在填充时没给它赋值。结合你的一对多关联模型,我给你两种靠谱的解决方法:
1. 先完善工厂定义
首先确保你的两个工厂定义正确:
Speciality工厂
$factory->define(App\Speciality::class, function (Faker $faker) { return [ 'name' => $faker->unique()->word, // 生成唯一的专业名称 ]; });
Procedure工厂
$factory->define(App\Procedure::class, function (Faker $faker) { return [ 'name' => $faker->unique()->word, // 生成唯一的流程名称 // 这里先不写speciality_id,我们通过关联来赋值 ]; });
2. 方法一:创建Speciality时批量关联生成Procedure
在Seeder文件里,利用模型的关联方法来自动处理speciality_id:
// 创建单个Speciality并附带3个Procedure factory(App\Speciality::class)->create()->procedures()->saveMany( factory(App\Procedure::class, 3)->make() ); // 批量创建5个Speciality,每个随机带2-5个Procedure factory(App\Speciality::class, 5)->create()->each(function ($speciality) { $speciality->procedures()->saveMany( factory(App\Procedure::class, rand(2, 5))->make() ); });
这里用make()生成Procedure实例(不会直接存库),再通过saveMany()关联到Speciality上,Laravel会自动给speciality_id赋值,完美避开字段无默认值的问题。
3. 方法二:在Procedure工厂里自动关联Speciality
如果你想单独生成Procedure,也可以在工厂里自动给speciality_id赋值:
$factory->define(App\Procedure::class, function (Faker $faker) { return [ 'name' => $faker->unique()->word, 'speciality_id' => function () { // 优先用已存在的第一个Speciality,没有就新建一个 return App\Speciality::first() ?? factory(App\Speciality::class)->create()->id; }, ]; });
这样你直接调用factory(App\Procedure::class)->create()时,speciality_id会自动被赋值,不会再报错。
最后再提醒下:检查你的procedures数据库表,speciality_id字段如果是NOT NULL约束,那必须确保填充时给它赋值,上面两种方法都能满足这个要求。
内容的提问来源于stack exchange,提问作者user860511
相关产品推荐
相关产品推荐

