
当使用 Laravel 的数据库填充器(Seeder)插入用户数据时,若数据表包含 created_at 和 updated_at 时间戳字段但未显式赋值,会因 Eloquent 模型或数据库严格模式触发报错;需手动设置时间戳或禁用自动维护。
当使用 laravel 的数据库填充器(seeder)插入用户数据时,若数据表包含 `created_at` 和 `updated_at` 时间戳字段但未显式赋值,会因 eloquent 模型或数据库严格模式触发报错;需手动设置时间戳或禁用自动维护。
在你提供的 UsersSeeder 中,调用 DB::table('users')->insert([...]) 是底层查询构造器操作,不经过 Eloquent 模型逻辑,因此不会自动填充 created_at 和 updated_at 字段。而你的 users 表极可能已定义了这两个 NOT NULL 的时间戳列(Laravel 默认迁移中常见),导致数据库拒绝插入缺少必填字段的记录,从而抛出类似 SQLSTATE[HY000]: General error: 1364 Field 'created_at' doesn't have a default value 的错误。
✅ 正确做法是:显式提供时间戳值。修改 run() 方法如下:
public function run()
{
DB::table('users')->insert([
'name' => 'Yasaman',
'email' => 'yasaman@example.com', // 注意:请替换为真实邮箱,原代码中含无效 HTML 链接
'password' => Hash::make('1234'),
'created_at' => now(),
'updated_at' => now(),
]);
}
⚠️ 注意事项:
- 邮箱字段原代码中混入了 Cloudflare 邮箱保护 HTML 标签(
<a class="__cf_email__" ...></a>),这会导致插入非法字符串甚至 SQL 错误,请务必使用纯文本邮箱地址; - 若你后续改用
User::create()(Eloquent 方式),则需确保模型中设置了protected $fillable并启用时间戳(默认已开启),且数据库允许NULL或有默认值; - 更健壮的做法是:在 Seeder 中批量插入多条记录时,统一使用
now()或\Carbon\Carbon::now()确保一致性; - 如需完全跳过时间戳,可在迁移中移除对应字段的
useTimestamps()逻辑(不推荐),或在表结构中为其设置DEFAULT CURRENT_TIMESTAMP(MySQL)——但 Laravel 官方推荐显式管理更可控。
运行修复后的 Seeder:
php artisan db:seed --class=UsersSeeder
如仍报错,请检查数据库是否启用了 STRICT_TRANS_TABLES 模式(可通过 SELECT @@sql_mode; 查看),并在 config/database.php 的 MySQL 配置中临时调整 strict => false(仅开发环境建议)。











