Laravel批量插入报错:SQLSTATE[42S22]找不到updated_at列
我编写了一个Laravel控制器函数,采用批量赋值方式向quizzes表插入新记录,但执行后出现如下错误:
"message": "SQLSTATE[42S22]: Column not found: 1054 Unknown column 'updated_at' in 'field list' (Connection: mysql, SQL: insert into
quizzes(title,isfree,updated_at,created_at) values (Menjaga Pola Makan, 1, 2024-01-13 06:20:07, 2024-01-13 06:20:07))",
"exception": "Illuminate\Database\QueryException",
"file": "D:\laravel\Quiz-Health-Education\vendor\laravel\framework\src\Illuminate\Database\Connection.php",
"line": 822
控制器代码
public function create(Request $request) { $request->validate([ 'title'=>'required', 'isfree'=>'required|boolean', 'img'=>'string|nullable', 'price'=>'nullable', 'disc'=>'nullable' ]); if($request->isfree === false) { $request['price'] = null; $request['disc'] = null; } $request['created_at'] = $request->date('d-m-Y'); Quiz::create($request->all()); return response()->json(['status' => 'success']); }
这个错误的核心原因是:Laravel模型默认会自动维护created_at和updated_at两个时间戳字段,但你的quizzes数据库表中没有updated_at字段,导致插入SQL执行失败。
有两种解决方式:
方式一:给数据库表添加updated_at字段
如果业务需要记录数据更新时间,可以通过迁移添加该字段:
- 生成迁移文件:
php artisan make:migration add_updated_at_to_quizzes_table --table=quizzes - 打开生成的迁移文件,修改
up和down方法:public function up() { Schema::table('quizzes', function (Blueprint $table) { $table->timestamp('updated_at')->nullable(); }); } public function down() { Schema::table('quizzes', function (Blueprint $table) { $table->dropColumn('updated_at'); }); } - 执行迁移:
php artisan migrate
方式二:关闭模型的自动时间戳功能
如果不需要自动维护这两个时间戳字段,直接在Quiz模型中添加一行代码即可:
class Quiz extends Model { public $timestamps = false; }
另外提个小建议:你手动给request['created_at']赋值的写法不够规范,若开启自动时间戳,Laravel会自动设置这两个字段的值,无需手动赋值。如果需要自定义时间格式,可以在模型中设置$dateFormat属性,或者用Carbon类处理日期。
内容的提问来源于stack exchange,提问作者Hello 123

