Laravel报错SQLSTATE[HY000]:1364,job_post_id字段无默认值
问题详情
运行dd($id)可正常获取数据,给$applicatesave->job_post_id = $id后调用applicationsave方法时触发数据库错误,错误信息如下:
SQLSTATE[HY000]: General error: 1364 Field 'job_post_id' doesn't have a default value (Connection: mysql, SQL: insert into
job_post_questions(question,application_id,type,updated_at,created_at) values (dasdsadas, 10, 2, 2023-04-08 16:56:15, 2023-04-08 16:56:15))
相关业务代码:
public function applicationsave(Request $request, $id) { // dd($id); $cv = $request->file('cv'); // Dosya yükleniyor $cvName = time() . '_' . $cv->getClientOriginalName(); // Dosya adı oluşturuluyor $cv->move(public_path('cv'), $cvName); // Dosya kaydediliyor $applicatesave = new applications(); $applicatesave->name = $request->name; $applicatesave->email = $request->email; $applicatesave->phone_number = $request->phone_number; $applicatesave->city = $request->city; $applicatesave->linkedin = $request->linkedin; $applicatesave->job_post_id =($id); $applicatesave->cv = 'cv/' . $cvName; $applicatesave->save(); foreach($request->question as $key=>$data){ $question = Job_post_questions::firstOrCreate( ['question' => $key], [ 'application_id' => $applicatesave->id, 'type' => 2, ] ); Answers::create([ 'question_id' => $question->id, 'answer' => $data, 'applications_id' => $applicatesave->id ]); } return back(); }
问题原因
错误并非来自applications表的插入,而是job_post_questions表的插入操作:你在Job_post_questions::firstOrCreate方法中,仅为question、application_id、type字段赋值,未传入job_post_id字段的值;而数据库中job_post_questions表的job_post_id字段被设置为非空(NOT NULL)且无默认值,因此插入时触发约束错误。
解决方案
方案1:为job_post_questions插入时补充job_post_id字段值
修改firstOrCreate的第二个参数,添加job_post_id字段,值为方法接收的$id:
$question = Job_post_questions::firstOrCreate( ['question' => $key], [ 'application_id' => $applicatesave->id, 'type' => 2, 'job_post_id' => $id // 新增此行,传入job_post_id的值 ] );
方案2:修改数据库表结构(如果业务允许)
如果job_post_questions表的job_post_id字段并非必填项,可以修改表结构,允许该字段为NULL或设置默认值:
- 直接执行SQL语句:
ALTER TABLE job_post_questions MODIFY COLUMN job_post_id INT NULL DEFAULT NULL;
- 或者通过Laravel迁移文件修改:
// 在对应的迁移文件中修改字段定义 $table->integer('job_post_id')->nullable()->default(null);
修改后运行php artisan migrate生效。
内容的提问来源于stack exchange,提问作者BnCrshr

