Symfony2 Doctrine Raw SQL存储过程循环遍历多个结果集

时间:2013-06-04 16:16:26

标签: symfony stored-procedures doctrine-orm

我已设法执行原始SQL(即没有ResultSetMapping),并且可以调用并执行MSSQL存储过程。

我的代码如下:

$em = $this->get('doctrine')->getManager();
$stmt = $em
    ->getConnection()
    ->prepare('EXEC someSP :id,null,:uid');
$stmt->bindValue('id', '629674');
$stmt->bindValue('uid', '217');
$stmt->execute();
$results = $stmt->fetchAll();

不行也不错;但是我遇到的问题是如果SP返回多个结果集,则上面只返回第一个结果集。有没有办法循环并获得每个结果集?

3 个答案:

答案 0 :(得分:1)

我不得不处理类似的问题,这就是我提出的问题。此函数来自扩展Doctrine \ ORM \ EntityRepository的类,因此我可以访问_em属性,一般情况下,您可以使用$this->get('doctrine')->getManager();来获取实体管理器。

protected function execMultiSetQuery($query, $params, $connection = 'default') {
    // Init
    $conn = $this->_em
        ->getConnection($connection)
        ->getWrappedConnection();

    // Processing
    if ($conn instanceof \Doctrine\DBAL\Driver\PDOConnection) {
        $stmt = $conn->prepare($query);
        $stmt->execute($params);

        // Loop through the row sets
        $results = array();
        do {
            try {
                $results[] = $stmt->fetch(\PDO::FETCH_ASSOC);
            }
            catch (\Exception $e) {}
        } while($stmt->nextRowset());

        $stmt->closeCursor(); // Clean up
        return $results;
    }
    else {
        return false;
    }
}

答案 1 :(得分:0)

您可以尝试逐个迭代每个集合。但真的fetchAll应该做同样的事情,尽管不能尝试......

$em = $this->get('doctrine')->getManager();
$stmt = $em
    ->getConnection()
    ->prepare('EXEC someSP :id,null,:uid');
$stmt->bindValue('id', '629674');
$stmt->bindValue('uid', '217');
$stmt->execute();
do{
    $results[] = $stmt->fetchAll()
} while($stmt->nextRowset());

答案 2 :(得分:0)

好的我能够做到这一点,但我必须在连接周围创建自己的包装器:

最好解决这个问题,但代码基本上是使用conf.yml中的DBAL参数创建一个新的PDO连接。它们准备并执行语句并返回所有结果集。

代码可以在这里免费使用: https://github.com/scott-davidjones/Symfony2DBALSPWrapper