You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,多选时会传入重复值。

解决方法

按以下步骤依次修正即可:

  1. 修正控制器参数获取逻辑,添加默认值避免空值:
// 第二个参数为默认值,未获取到参数时返回空数组,避免遍历空值报错
$medicines = request()->post('medicine_pills', []);
// 从请求中获取该参数,不要直接使用未定义变量
$last_appointment_id = request()->post('last_appointment_id');
  1. 修正控制器遍历与写入逻辑:
foreach ($medicines as $item) {
    // 调试可使用var_dump($item),不要用echo输出数组
    Medicine::create([
        'medicines_cats' => $item,
        // 修正字段拼写错误,确认和数据库字段名一致
        'appointment_id' => $last_appointment_id,
    ]);
}
  1. 提前在Medicine模型中添加批量赋值白名单,确保$fillable属性包含要写入的两个字段:
// Medicine.php模型中
protected $fillable = ['medicines_cats', 'appointment_id'];
  1. 前端添加空值兼容逻辑:
// 未选中任何选项时默认返回空数组,避免传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等回调逻辑,避免请求无响应处理
});
  1. 检查控制器所有代码,确认没有出现$变量()的错误调用格式。

内容的提问来源于stack exchange,提问作者user17171534

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:09:03