Laravel 8 User工厂报错:Field 'username'无默认值
问题分析
调用User::factory()->create()时触发数据库错误:
SQLSTATE[HY000]: General error: 1364 Field 'username' doesn't have a default value (SQL: insert into
admin_users(updated_at,created_at) values (2023-01-01 10:00:00, 2023-01-01 10:00:00))
从SQL语句能看出,仅插入了默认的时间戳字段,工厂定义的username等必填字段完全没被写入。结合你手动实例化赋值save()正常的情况,说明问题出在工厂与模型的绑定关系上——Laravel没有正确识别UserFactory对应的User模型,导致工厂定义的字段数组未被使用。
正确解决方案
在UserFactory类中明确指定关联的User模型即可解决:
<?php namespace Database\Factories; use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; class UserFactory extends Factory { // 新增:明确绑定工厂对应的User模型 protected $model = User::class; public function definition(): array { return [ 'username' => $this->faker->unique()->userName, 'password' => bcrypt('password'), 'name' => $this->faker->name, 'avatar' => $this->faker->imageUrl(), 'email' => $this->faker->unique()->safeEmail ]; } }
验证修改
修改完成后重新执行User::factory()->create();,Laravel会正确读取工厂定义的字段数组,结合模型的$fillable配置完成批量插入,满足数据库必填字段要求,不会再触发1364错误。
补充说明
你之前用protected $model = Administrator::class的临时方案能生效,是因为该模型与admin_users表绑定正确,但不符合你的实际业务模型需求。通过给UserFactory指定正确的User模型,既解决了问题,又符合代码语义化和项目结构规范。
内容的提问来源于stack exchange,提问作者Max Slyusarchuk
相关产品推荐
相关产品推荐

