如何在Laravel中获取存储过程返回的全部结果?
Laravel中调用存储过程如何获取全部返回结果?
我用以下代码调用MySQL存储过程:
$res = DB::select("CALL lending_ewallets_balance_in_merchant(87,165);");
直接在MySQL里执行这个存储过程会返回两行数据,但用dd($res)查看时只拿到一行。我想通过Laravel的方式获取全部结果,而不是直接用PDO的fetchAll()或循环fetch()。
解决方法
Laravel的DB::select()默认仅获取存储过程返回的第一个结果集,要获取所有结果集,可通过以下方式实现:
方法1:通过Laravel连接实例处理多结果集
// 获取数据库连接实例 $connection = DB::connection(); // 准备并执行存储过程 $statement = $connection->getPdo()->prepare("CALL lending_ewallets_balance_in_merchant(87,165);"); $statement->execute(); // 循环获取所有结果集 $allResults = []; do { $allResults = array_merge($allResults, $statement->fetchAll(\PDO::FETCH_ASSOC)); } while ($statement->nextRowset()); dd($allResults);
该方式基于Laravel的数据库连接实例操作,既满足你不想直接使用原生PDO的需求,又能获取全部结果。
方法2:自定义查询宏(便于复用)
如果需要多次调用多结果集的存储过程,可在AppServiceProvider的boot()方法中定义宏:
use Illuminate\Database\Connection; public function boot() { Connection::macro('selectProcedure', function ($procedureSql) { $statement = $this->getPdo()->prepare($procedureSql); $statement->execute(); $allResults = []; do { $allResults = array_merge($allResults, $statement->fetchAll(\PDO::FETCH_ASSOC)); } while ($statement->nextRowset()); return $allResults; }); }
后续调用时只需一行代码:
$res = DB::selectProcedure("CALL lending_ewallets_balance_in_merchant(87,165);"); dd($res);
排查提示
如果执行后仍未获取全部数据,先确认存储过程是否确实返回了多个结果集,而非单个结果集内的多行数据(若为单结果集多行,DB::select()应直接返回全部,此时需检查存储过程逻辑)。
内容的提问来源于stack exchange,提问作者Martin AJ
相关产品推荐
相关产品推荐

