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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:05:10