Laravel中通过AJAX提交multi-select多选数据报Function name must be a string错误如何解决
错误原因
Function name must be a string报错的核心触发逻辑是代码中出现了$变量()格式的调用,但该变量的值不是合法的字符串类型函数名,结合给出的代码,具体问题如下:
- 控制器未从请求中获取
last_appointment_id参数,直接使用未定义的变量,若存在笔误将变量写为$last_appointment_id()格式就会触发该报错,即使没有笔误也会抛出变量未定义的异常。 - 前端多选框未选中任何选项时,
$('#medicine_pills').val()会返回null,后端拿到的$medicines值为null,如果有将该变量误写为$medicines()的笔误也会触发该报错,无笔误的情况下遍历null也会抛出类型错误。 - 存在低概率的笔误场景:将请求获取代码
request()->post('medicine_pills')误写为request()('medicine_pills'),多打了括号将请求实例当函数调用,直接触发该报错。 - 代码中额外存在的非触发本次报错的问题:控制器中
echo $medicines逻辑错误,$medicines是数组类型不能直接用echo输出;create方法中的appointmen_id字段存在拼写错误,正确拼写应为appointment_id;多选框的两个option值均为2,多选时会传入重复值。
解决方法
按以下步骤依次修正即可:
- 修正控制器参数获取逻辑,添加默认值避免空值:
// 第二个参数为默认值,未获取到参数时返回空数组,避免遍历空值报错 $medicines = request()->post('medicine_pills', []); // 从请求中获取该参数,不要直接使用未定义变量 $last_appointment_id = request()->post('last_appointment_id');
- 修正控制器遍历与写入逻辑:
foreach ($medicines as $item) { // 调试可使用var_dump($item),不要用echo输出数组 Medicine::create([ 'medicines_cats' => $item, // 修正字段拼写错误,确认和数据库字段名一致 'appointment_id' => $last_appointment_id, ]); }
- 提前在
Medicine模型中添加批量赋值白名单,确保$fillable属性包含要写入的两个字段:
// Medicine.php模型中 protected $fillable = ['medicines_cats', 'appointment_id'];
- 前端添加空值兼容逻辑:
// 未选中任何选项时默认返回空数组,避免传null var medicine_pills = $('#medicine_pills').val() || []; $.ajax({ url: '{{ url('medicine') }}', type: "post", data: { '_token': "{{ csrf_token() }}", 'medicine_pills': medicine_pills, 'last_appointment_id': last_appointment_id, }, // 补充complete、success等回调逻辑,避免请求无响应处理 });
- 检查控制器所有代码,确认没有出现
$变量()的错误调用格式。
内容的提问来源于stack exchange,提问作者user17171534
相关产品推荐
相关产品推荐

