create() 有时会失败是因为字段未加入 $fillable 白名单或模型未正确配置批量赋值保护,Laravel 默认禁止批量写入以防止敏感字段被意外覆盖。

直接用 create() 最快,但必须确保模型已配置 $fillable;否则会报 MassAssignmentException 错误。
为什么 create() 有时会失败?
常见错误是字段没进白名单,或模型没启用批量赋值保护。Laravel 默认禁止所有字段批量写入,防止意外覆盖敏感字段(比如 is_admin、password)。
-
create()内部调用的是fill()+save(),所以它只接受$fillable列表里的字段 - 如果模型里写了
$guarded = ['*']或留空$fillable,create()就会静默跳过字段,甚至抛异常 - 使用
new Model([...])->save()可绕过白名单,但不推荐——失去安全边界
create() 和 insert() 的关键区别
create() 是 Eloquent 层方法,走模型生命周期(触发事件、类型转换、boot() 钩子);insert() 是 Query Builder 方法,直插数据库,不实例化模型,也不触发任何模型逻辑。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 需要自动处理
created_at/updated_at、Carbon 转换、访问器/修改器?选create() - 插入成千上万条测试数据且不关心模型行为?用
DB::table('users')->insert([...])更快 -
insert()不返回主键 ID(除非用insertGetId()),而create()返回完整模型实例
带关联的新记录怎么一次性创建?
不能靠 create() 直接写入关联字段(比如 post_id 在 Comment 模型里),得先有父模型,再用关联方法插入子记录。
- 正确方式:
$post->comments()->create(['content' => 'hello'])—— 自动填入post_id - 批量插入多个关联记录:
$post->comments()->createMany([['content' => 'a'], ['content' => 'b']]) - 如果硬要用
create()并手动传post_id,必须确认该字段在Comment::$fillable中,且外键约束允许
工厂创建测试数据时要注意什么?
用 factory(User::class)->count(10)->create() 看似简单,但默认只生成基础字段;若模型有非空约束、唯一索引或依赖关联,容易报错。
- 工厂定义里应显式覆盖关键字段,比如
'email' => $this->faker->unique()->safeEmail() - 涉及外键(如
user_id)时,别用mt_rand(1, 100)硬塞——目标记录可能还没建,改用User::factory()关联工厂 - 运行前确保迁移已执行、数据库连接正常,否则
db:seed会卡在第一个失败的create()
最易被忽略的一点:模型的 $table 属性如果没显式指定,Laravel 会按复数规则推导(比如 User → users),一旦表名不匹配,create() 插进去的数据就“消失”在错误的表里,查都查不到。

















