我已设法执行原始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返回多个结果集,则上面只返回第一个结果集。有没有办法循环并获得每个结果集?
答案 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