
当使用 php artisan db:seed --class=UsersSeeder 命令时出现错误,通常是因为模型时间戳字段(如 created_at 和 updated_at)未被赋值或数据库严格模式拒绝空值。本文将指导你快速定位并修复该问题。
当使用 `php artisan db:seed --class=usersseeder` 命令时出现错误,通常是因为模型时间戳字段(如 `created_at` 和 `updated_at`)未被赋值或数据库严格模式拒绝空值。本文将指导你快速定位并修复该问题。
在 Laravel 中,DB::table() 执行原始插入时不会自动处理 Eloquent 的时间戳逻辑(如自动填充 created_at/updated_at),而你的 users 表很可能已定义了这两个 NOT NULL 的时间戳字段(Laravel 默认迁移中即如此)。若插入数据时未显式提供其值,MySQL 严格模式下会直接报错(例如 SQLSTATE[HY000]: General error: 1364 Field 'created_at' doesn't have a default value)。
✅ 正确做法:在 insert() 数组中显式添加时间戳字段:
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Carbon; // ? 引入 Carbon 便于生成时间
// ...
public function run()
{
DB::table('users')->insert([
'name' => 'Yasaman',
'email' => 'yasaman@example.com', // ⚠️ 注意:原代码中 email 是 HTML 转义后的链接,请替换为纯字符串
'password' => Hash::make('1234'),
'created_at' => Carbon::now(),
'updated_at' => Carbon::now(),
]);
}
? 关键注意事项:
- ✅ 邮箱字段必须是纯文本字符串(如
'yasaman@example.com'),而非含<a></a>标签或data-cfemail的混淆 HTML —— 这会导致插入失败或数据污染; - ✅ 若表中还存在其他
NOT NULL字段(如email_verified_at),也需一并提供值(可设为null,但需确保字段允许 NULL;否则须填Carbon::now()或NULL); - ✅ 更推荐的方式是使用 Eloquent 模型进行填充(自动处理时间戳),例如:
use App\Models\User;
// 替代 DB::table() 方式:
User::create([
'name' => 'Yasaman',
'email' => 'yasaman@example.com',
'password' => Hash::make('1234'),
]);
? 提示:若使用模型方式,请确认
User模型中$fillable已包含对应字段,且timestamps = true(默认即开启)。
最后,运行前请确保数据库连接正常,并检查 config/database.php 中的 strict 设置(开发环境可临时设为 false 辅助调试,但生产环境务必保持 true 并显式处理字段)。修复后执行命令即可成功填充数据。











