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
相关产品推荐
相关产品推荐

