我尝试了两种使用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没有。
为什么结果有两种不同的类型,区别是什么?
答案 0 :(得分:0)
安静的旧问题,但是当我研究Laminas项目(https://getlaminas.org/)时,我遇到了一个相同的问题(没有看到树木成荫的森林)。简而言之:
长答案:
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)是一个“便利功能”。
如果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不返回数据;-)