只需要了解一下ZF2中的一些简单数据库查询。在ZF1中我有这样简单的方法:
public function recordset()
{
// listing of all records
$db = Zend_Registry::get('db');
$sql = "SELECT " . $this->_selectlist() .
" from customer c";
$r = $db->fetchAll($sql);
return $r;
}
在ZF2中,我该怎么做?我已经尝试了以下内容,但这只是返回看起来像“Result”对象的东西,但我想要的是像ZF1那样使用fetchAll执行的数组。如果我必须迭代结果对象只是为了稍后提供数组,然后必须重复迭代,这似乎是一些重复工作。
无论如何,这是我到目前为止在ZF2中所拥有的:
//above the controller start I have: use Zend\Db\Adapter\Adapter as DbAdapter;
public function blaAction()
{
$db = new DbAdapter(
array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=mydb;host=localhost',
'username' => 'root',
'password' => '',
)
);
$sql = 'select * from customer';
$stmt = $db->query($sql);
$results = $stmt->execute();
$this->view->data = $results;
return $this->view;
}
在输出中,我得到了这个:
object(Zend\Db\Adapter\Driver\Pdo\Result)#197 (8) {
["statementMode":protected]=> string(7) "forward" ["resource":protected]=> object(PDOStatement)#195 (1) {
["queryString"]=> string(22) "select * from customer"
} ["options":protected]=> NULL ["currentComplete":protected]=> bool(false) ["currentData":protected]=> NULL ["position":protected]=> int(-1) ["generatedValue":protected]=> string(1) "0" ["rowCount":protected]=> NULL
}
但是,如果我将$ results更改为$results->count();
,我确实会看到记录数。我如何作为数组获取数据? (完整的记录集)
有一次我确实看到了这样的话:$results->current()
但那只返回了一条记录。
只是旁注。我确实看到了我可以使用的所有表抽象类,但在我学习的这一点上,我不想那样做。我只想要一些简单的按需查询返回数组,就像在ZF1中一样。在ZF2中,在配置和东西中似乎有太多“连线”的东西,这看起来有点矫枉过正。但是,作为一个框架,我喜欢灵活性,我在ZF1中工作的主应用程序可以真正受益于ZF2的模块化。 (否则我可能会选择其他框架)
请原谅我的无知,非常感谢你的帮助!
答案 0 :(得分:8)
来自http://framework.zend.com/manual/2.0/en/modules/zend.db.result-set.html:
Zend \ Db \ ResultSet是Zend \ Db的子组件,用于抽象行集生成查询的迭代。
所以你可以做到以下几点:
$statement = $db -> query($sql);
/** @var $results Zend\Db\ResultSet\ResultSet */
$results = $statement -> execute();
$returnArray = array();
// iterate through the rows
foreach ($results as $result) {
$returnArray[] = $result;
}
现在您可以将其发送到视图:
return new ViewModel(array('results' => $returnArray));
答案 1 :(得分:4)
好的,我想我已经知道了。至少这将暂时完成这项工作。基本上,您必须添加一个额外的步骤并将结果对象提供给具有toArray便捷方法的ResultSet对象。我想这可以通过其他一百万种方式来完成,但是......这很有效。
请记住,我不会在控制器中执行此操作,甚至不会以这种方式执行此操作,但此时它只是一个测试。有时我想要这个,这就是ZF2 可以做的,如果需要的话。 (从不关注好/坏习惯)
在Controller的顶部添加/使用ResultSet:
use Zend\Db\ResultSet\ResultSet;
以下是工作测试操作:
public function blaAction()
{
$db = new DbAdapter(
array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=mydb;host=localhost',
'username' => 'root',
'password' => '',
)
);
$sql = 'select * from customer
where cust_nbr > ? and cust_nbr < ?';
$sql_result = $db->createStatement($sql, array(125000, 125200))->execute();
if($sql_result->count() > 0){
$results = new ResultSet();
$this->view->data = $results->initialize($sql_result)->toArray();
}
return $this->view;
}
toArray正在为你做一个foreach循环,所以,我想它仍然会添加我想避免的额外数组循环,但是没有看过他们代码的ZF1版本,不管怎样它也可以这样做。
我可能会做的是为Zend \ Db创建一个简单的db包装类,它从ZF1替换我的Zend_Registry语句并添加一个fetchAll和fetchOne方法,这样我就可以更快地将一堆ZF1代码移植到ZF2上
感谢您在评论中的意见,我很感激。 :)
哦,我也想提一下。我遇到了有人创建的 bridge 类,这可能也有帮助: https://github.com/fballiano/zfbridge
修改强> 因此返回的适配器结果是可迭代的。我不知道我采取了哪些步骤导致了我的困惑,但是$ db-&gt;查询中的结果作为Pdo \ Result对象返回,并且可以在foreach中循环播放。搞砸了我的事实是,如果你var_dump它,它不会显示数组数据,只显示对象。这让我陷入了一条完全令人困惑的道路。
现在,即使上述工作,这是更好的IMO,因为我们可以采取该对象,将其发送到我们想要稍后迭代的地方。 (而不是循环遍历整个事物,先创建一个数组,只迭代另一个循环,浪费时间)
这是一个我更喜欢的工作示例。你只需循环对象,就有你的数据!咄!不知道我有时会想念简单的事情。 :)
public function blaAction()
{
$db = new DbAdapter(
array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=gwdb;host=localhost',
'username' => 'root',
'password' => '',
)
);
$sql = 'select * from customer
where cust_nbr > ? and cust_nbr < ?';
$rs = $db->query($sql)->execute(array(125000, 125200));
// Source of confusion: this doesn't dump the array!!!
// It dumps the object properties for Pdo\Result
Debug::dump($rs);
// but it is still able to iterate records directly
// without toArray
foreach ($rs as $row){
Debug::dump($row);
}
return $this->view;
}
答案 2 :(得分:3)
经过长时间的搜索,我以这种方式在ZF2中查找我的SQL查询
libs/custom.jar
诀窍是PHP函数iterator_to_array
答案 3 :(得分:2)
您可以通过执行以下操作来避免foreach循环:
$statement = $db->query($sql);
/** @var $results Zend\Db\ResultSet\ResultSet */
$results = $statement->execute();
$data = $result->getResource()->fetchAll();
// Now data is an array
答案 4 :(得分:1)
我的英语很腐烂 我也遇到过这个问题,$ returnType定义在Zend \ Db \ ResultSet \ ResultSet中 我们可以为Zend \ Db \ Adapter \ Adapter提供第三个参数,就像这个
$adapter = new Zend\Db\Adapter\Adapter($db_config,null,new Zend\Db\ResultSet\ResultSet('array'));
$re = $adapter->query('select * from mooncake', $adapter::QUERY_MODE_EXECUTE);
$s = $re->current();
var_dump($s);
现在,$ s是数组