Zend \ Db Result和ResultSet有什么区别?

时间:2014-07-23 15:22:18

标签: php zend-framework2 zend-db

我尝试了两种使用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没有。

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

1 个答案:

答案 0 :(得分:0)

安静的旧问题,但是当我研究Laminas项目(https://getlaminas.org/)时,我遇到了一个相同的问题(没有看到树木成荫的森林)。简而言之:

  • 对INSERT,UPDATE,DELETE等使用/使用结果。
  • 使用/使用ResutlSet for SELECT,使用$ resultSet-> initialize($ result)进行数据传输/初始化

长答案:

Laminas\Db\Adapter\Driver\ResultInterface extends Countable, Iterator

例如

Laminas\Db\Adapter\Driver\Pdo\Result implements Iterator, ResultInterface

Result是返回结果的基本对象。在这里,您还具有current()方法来获取数据,但在这里,您仅具有诸如getAffectedRows()和getGeneratedValue()之类的方法。 (对于后者,也可能需要$ adapter-> getDriver()-> getConnection()-> getLastGeneratedValue()。) 此外,这里还有isQueryResult()方法,该方法例如用作$ adapter-> query()中的开关。 isQueryResult()仅对SELECT语句返回TRUE(即使结果为空且count()== 0 ),否则,对于INSERT,UPDATE,...返回FALSE。

例如,用于PDO的Laminas-Db始终(仅)返回$ statement-> execute($ params)的Result对象。 另一方面,$ adapter-> query($ sql)是一个“便利功能”。

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

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

另一方面:

Laminas\Db\ResultSet\ResultSetInterface extends Traversable, Countable
Laminas\Db\ResultSet\AbstractResultSet implements Iterator, ResultSetInterface
Laminas\Db\ResultSet\ResultSet extends AbstractResultSet

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

此外,对于无法准备的语句,必须使用$ adapter-> query($ sql,$ adapter :: QUERY_MODE_EXECUTE),例如DDL语句(在这里,您还必须使用Result而不是ResultSet; ALTER TABLE不返回数据;-)