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

Laravel调用MySQL存储过程仅返回首表,如何获取全部3个结果表供Vue SPA使用

Laravel调用返回多结果集的MySQL存储过程解决方案

核心原因:Laravel 封装的DB::select()方法默认仅读取存储过程返回的第一个结果集,要获取全部结果集需要调用底层PDO的行集遍历方法。

后端接口修改代码

public function getTables(Request $request)
{
    // 获取当前数据库连接的PDO实例
    $pdo = DB::connection()->getPdo();
    // 预处理存储过程调用语句
    $stmt = $pdo->prepare("CALL all_result(?, ?)");
    // 绑定入参并执行
    $stmt->execute([$request->input('in1'), $request->input('in2')]);

    $allResults = [];
    do {
        // 读取当前结果集的全部数据
        $allResults[] = $stmt->fetchAll(\PDO::FETCH_ASSOC);
    } while ($stmt->nextRowset()); // 切换到下一个结果集,直到所有结果集读取完毕

    // 返回的数组顺序和存储过程中select语句的顺序完全对应
    return response()->json($allResults);
}

前端Axios获取数据示例

// 接口请求示例,参数根据实际业务传递
axios.get('/你的接口路径', {
  params: {
    in1: '第一个入参值',
    in2: '第二个入参值'
  }
}).then(res => {
  // res.data[0] 对应存储过程中table1的查询结果
  // res.data[1] 对应存储过程中table2的查询结果
  // res.data[2] 对应存储过程中table3的查询结果
  const [table1Data, table2Data, table3Data] = res.data
  // 后续业务逻辑处理
})

注意事项

  • 你当前提供的存储过程定义为无参类型,但调用时传入了2个参数,会直接执行报错,需要先修正存储过程的参数定义,示例如下:
DELIMITER $$
-- 入参类型根据实际业务需求修改
CREATE PROCEDURE all_result(IN in1 VARCHAR(255), IN in2 INT)
BEGIN
  SELECT * FROM table1;
  SELECT * FROM table2;
  SELECT * FROM table3;
END $$
DELIMITER ;
  • 如果读取多结果集时报错,可检查config/database.php中MySQL配置项的PDO参数,确保关闭模拟预处理:
'mysql' => [
    // 其余配置保持不变
    'options' => [
        PDO::ATTR_EMULATE_PREPARES => false,
    ],
],

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 00:18:04