ZendDb Result和ResultSet之间的区别是什么?


What is the difference between ZendDb Result and ResultSet?

我已经尝试了使用Zend'Db'Sql'Select:

获取的两种文档方法
$statement = $sql->prepareStatementForSqlObject($select);
$results = $statement->execute();

$selectString = $sql->getSqlStringForSqlObject($select);
$results = $adapter->query($selectString, $adapter::QUERY_MODE_EXECUTE);

第一个方法返回Zend'Db'Adapter'Driver'Pdo'Result (ResultInterface的实例),而第二个方法返回Zend'Db'ResultSet'ResultSet (ResultSetInterface)。ResultSet有toArray()方法,而Result没有。

为什么有两种不同类型的结果,有什么区别?

安静的老问题,但我有同样的问题(不见森林见树木),当我看到项目Laminas (https://getlaminas.org/)。简而言之:

  • 使用/使用Result进行INSERT, UPDATE, DELETE等操作
  • 使用/使用resultSet进行SELECT,使用$resultSet->initialize($result)进行数据传输/初始化

长答:

Laminas'Db'Adapter'Driver'ResultInterface extends count, Iterator

Laminas'Db'Adapter'Driver'Pdo'Result实现了Iterator, ResultInterface

Result是返回结果的基本对象。这里也有一个方法current()来获取数据,但是这里只有getAffectedRows()和getGeneratedValue()这样的方法。(对于后者,也可以使用$adapter->getDriver()->getConnection()->getLastGeneratedValue()。)此外,这里还有isQueryResult()方法,例如在$adapter->query()中用作开关。isQueryResult()仅对SELECT-Statement (,即使其结果为空且count() == 0)返回TRUE,否则对INSERT, UPDATE,…返回FALSE

例如,Laminas-Db For PDO总是(且仅)返回一个Result对象,用于执行$statement->execute($params)。另一方面,$adapter->query($sql)是一个"方便函数"。

  • 默认情况下,它准备一个Statement对象并返回它
  • 如果提供了参数,它将直接执行隐式生成的语句并返回结果,
  • 如果使用QUERY_MODE_EXECUTE标志(这只对普通SQL是可能的,因为在这种情况下,您不能提供一个参数数组来替换),查询也会直接执行。

如果query()直接执行SQL,返回的对象取决于查询类型。如果Result对象确认了SELECT语句(使用isQueryResult()进行检查),它将数据注入克隆的ResultSet对象。对于所有其他查询,它直接返回原始Result对象。

另一方面:
Laminas'Db'ResultSet'ResultSetInterface extends Traversable, Countable
Laminas'Db'ResultSet'AbstractResultSet实现Iterator, ResultSetInterface
Laminas'Db'ResultSet'ResultSet extends AbstractResultSet

本质上是用来迭代"real"结果集(和数据),由SELECT语句生成。它没有构造函数。你必须使用它的initialize($dataSource)方法来提供可能类型的数据:array|Iterator|IteratorAggregate|ResultInterface。例如"方便函数"。$adapter->query($sql)对SELECT查询隐式执行此操作,并为这些查询返回ResultSet而不是Result。

另外,你必须使用$adapter->query($sql, $adapter::QUERY_MODE_EXECUTE)语句,不能准备,例如DDL语句(这里你还必须使用Result而不是ResultSet;-)