如何解决Illuminate\Database\Grammar::parameterize()需数组参数却传入字符串的错误
错误根因
DB::select() 方法执行查询后返回的是包含所有匹配结果的数组,即使你的查询逻辑只需要获取单个ID值,返回的也是包裹了stdClass对象的结果集数组,而非直接的ID数值/字符串。你直接将该数组赋值给course_id字段,模型执行保存操作时无法识别数组类型的字段值,就会触发参数类型不匹配的报错。
另外你当前直接拼接变量到原生SQL的写法存在SQL注入风险,建议同步调整。
修复方案
推荐使用查询构造器的value()方法直接提取单个字段的值,修改原查询语句即可:
// 替换原$courseid查询行,直接获取匹配到的课程ID $courseid = DB::table('course')->where('course_code', $coursecode)->value('id');
如果需要兼容课程编码不存在的异常场景,可以增加校验逻辑,避免出现course_id为空的错误:
if (empty($courseid)) { return back()->with('alert-error', '输入的课程编码不存在,请检查后重试'); }
修复后完整代码
public function assign(Request $request) { $courselist = new Courselist; $coursecode = $request->input('coursecode'); // 修正查询逻辑,直接取ID,同时规避SQL注入风险 $courseid = DB::table('course')->where('course_code', $coursecode)->value('id'); // 可选:课程不存在校验 if (empty($courseid)) { return back()->with('alert-error', '输入的课程编码无效,无法匹配到对应课程'); } $courselist->course_id = $courseid; $courselist->coordinator = $request->input('coordinatorname'); $courselist->internal = $request->input('imname'); $courselist->external = $request->input('exname'); $courselist->dean = $request->input('deanname'); $courselist->save(); return back()->with('alert-success','Data successfully added!'); }
补充说明
如果你已经创建了Course模型,也可以用模型查询写法更简洁:
$courseid = Course::where('course_code', $coursecode)->value('id');
内容的提问来源于stack exchange,提问作者user17298617
相关产品推荐
相关产品推荐

