【问题标题】:How to call PDOStatement::nextRowset() in Cakephp 3如何在 Cakephp 3 中调用 PDOStatement::nextRowset()
【发布时间】:2017-02-10 11:52:34
【问题描述】:

我创建了一个过程,其中我有两个 select 语句正在运行。

$stmt = $this->_connection->execute("CALL myFunction(:user_id)", [
    'user_id' => $userId
]);

但是当我试图像这样调用 nextRowset() 时

$stmt->nextRowset();

它给了我错误

调用未定义的方法 Cake\Database\Log\LoggingStatement::nextRowset()

所以,我的问题是如何在 Cakephp 3 中调用 nextRowset()

【问题讨论】:

  • 您确定$stmt 是pdoStmt 吗?
  • @u_mulder 不,不是,正如您从错误中看到的那样。我不知道 cakephp 3 中获取 pdostmt 的方法。
  • 除非你有自己的 StatementInterface 实现,否则你不能。基本上你需要扩展 cake 的 PDOStatement 才能访问原始的 \PDOStatement。
  • @AlexBlex 那么没有直接的方法吗?我应该编辑 cakephp 的核心文件吗?
  • 不,没有直接的方法。更改框架的文件是最不推荐的方式。尝试扩展核心类并让框架使用它们。

标签: php mysql cakephp pdo cakephp-3.0


【解决方案1】:

鉴于所有核心语句类都在某些时候扩展了\Cake\Database\Statement\StatementDecorator,您可以通过StatementDecorator::getInnerStatement() 访问底层原生\PDOStatement 对象,例如:

while ($stmt instanceof StatementDecorator) {
    $stmt = $stmt->getInnerStatement();
}

if (!($stmt instanceof \PDOStatement)) {
    throw new \RuntimeException('Expected an instance of \PDOStatement');
}

然后您可以使用标准的 PDO 语句过程,例如循环遍历行集:

do {
    $rowset = $stmt->fetchAll(PDO::FETCH_ASSOC);
    // ...
} while ($stmt->nextRowset());

正如 cmets 中已经提到的,另一种方法是实现您自己的语句类(并使您的代码期望该具体实现的实例)。但是,为了实现跨数据库兼容性,您必须实现四个不同的语句,外加四个驱动程序,您将在其中重新实现 \Cake\Database\Driver::prepare(),因为这是生成语句实例的地方。

如果你想支持查询日志,你必须创建一个自定义连接类并覆盖\Cake\Database\Connection::prepare()\Cake\Database\Connection::_newLogger(),因为这是驱动程序生成的语句被包装在\Cake\Database\Log\LoggingStatement中的地方案例查询日志记录已启用。

我想说,如果您只想支持内置驱动程序,那么暂时期待\Cake\Database\Statement\StatementDecorator 实例可能是更好的选择,尽管它并不太好。您可能希望 suggest adding functionality 将多行集语句作为增强功能,但不确定是否会有很多支持。

另见

【讨论】:

  • 感谢伙计,它成功了。我可以这样做while (!($stmt instanceof \PDOStatement)) { $stmt = $stmt->getInnerStatement(); } 而不是抛出异常
  • @AmanRawat 我不建议这样做,因为它不会检查$stmt 是否是StatementDecorator,即调用getInnerStatement() 是否安全。您当然不需要抛出异常,这只是一个示例,您当然可以选择侵入性较小的错误处理,例如返回false,显示一条消息等,这一切都取决于您所在的上下文' d 使用该代码。
  • 好的,知道了。谢谢
猜你喜欢
  • 2015-02-10
  • 2014-10-23
  • 2014-12-13
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多