只需要一只手理解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,我会怎么做? 我曾尝试以下,但是这只是返回什么看起来像一个“结果”的对象,但我要的是一个数组一样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->count();
我确实确实看到记录计数。 如何获取数据,虽然作为一个数组? (一个完整的记录)
有一次,我没有看到这样的: $results->current()
但只返回一个记录。
只是一个方面说明。 我看到所有的表抽象类,我可以使用,但在我的学习这一点上,我不想这样做。 我只想说,就像他们在做ZF1返回数组的一些简单的按需查询。 在ZF2,还有似乎太多“接线,”在CONFIGS和东西的事情,只是看起来像矫枉过正。 但是,作为一个框架,我喜欢的灵活性和主要的应用程序,我在ZF1工作能真正从ZF2的模块化受益。 (否则,我可能会跟其他的框架去)
请原谅我的无知,并非常感谢您的帮助!
从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));
好吧,我想我已经得到了它。 至少,这将暂时做的工作。 基本上,你必须添加一个额外的步骤和将结果对象插入具有指定者简便方法。ResultSet对象。 我想这可能是做一个亿种的其他方式,但是......这个工程。
请记住,我不会在控制器做到这一点,甚至在这个具体的方式,但其仅在这一点上进行测试。 有次,我想这可以,这是ZF2怎么能做到这一点,如果一个期望。 (从不介意好/坏习惯)
在控制器添加顶部/使用的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;
}
指定者只是做一个foreach循环给你,所以,我想它还是增加额外的阵列循环我想避免,但没有看着ZF1版本的他们的代码,也许它做同样的反正。
我可能会做的是创造的Zend \ Db的一个简单的分贝包装类,从ZF1代替我合适的词汇语句,并增加了使用fetchall和fetchOne方法,这样我可以很快端口在一堆ZF1代码ZF2容易得多。
感谢您的评论你的投入,我很感激。 :)
呵呵,我也想提一提。 我跑进创建了这个桥类人,这也可能会有所帮助: https://github.com/fballiano/zfbridge
编辑:那么返回的适配器结果是可迭代的事实证明。 我不知道我花了,导致我的困惑是什么步骤,但在$ DB->查询返回结果为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;
}
漫长的探索后,我韩德尔我的SQL查询中ZF2这样
$sql = new \Zend\Db\Sql\Sql($this->tableGateway->getAdapter());
$select = $sql->select();
$select->from('table');
$select->columns(array('*'));
$select->join("join table", "table.id = join table.id", array("*"), "left");
$statement = $sql->prepareStatementForSqlObject($select);
$results = $statement->execute();
return iterator_to_array($results));
诀窍是PHP函数iterator_to_array
您可以通过执行以下操作避免foreach循环:
$statement = $db->query($sql);
/** @var $results Zend\Db\ResultSet\ResultSet */
$results = $statement->execute();
$data = $result->getResource()->fetchAll();
// Now data is an array
我的英语非常烂
我也遇到了这个问题,$返回类型定义在Zend的\ DB \的ResultSet \的ResultSet
我们可以给第三个参数为Zend的\ DB \适配器\适配器,这样
$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是数组