gre*_*eek 9 php database frameworks zend-framework2
只需要了解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;
}
Run Code Online (Sandbox Code Playgroud)
在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;
}
Run Code Online (Sandbox Code Playgroud)
在输出中,我得到这个:
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
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我将$ results更改为$results->count(); I确实会看到记录计数.我如何作为数组获取数据?(完整的记录集)
有一次,我确实看到了类似的东西: $results->current()
但那只返回了一条记录.
只是旁注.我确实看到了我可以使用的所有表抽象类,但在我学习的这一点上,我不想那样做.我只想要一些简单的按需查询返回数组,就像在ZF1中一样.在ZF2中,在配置和东西中似乎有太多"连线"的东西,这看起来有点矫枉过正.但是,作为一个框架,我喜欢灵活性,我在ZF1中工作的主应用程序可以真正受益于ZF2的模块化.(否则我可能会选择其他框架)
请原谅我的无知,非常感谢你的帮助!
小智 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;
}
Run Code Online (Sandbox Code Playgroud)
现在您可以将其发送到视图:
return new ViewModel(array('results' => $returnArray));
Run Code Online (Sandbox Code Playgroud)
好的,我想我明白了。至少这将暂时完成这项工作。基本上,您必须添加一个额外的步骤并将结果对象提供给具有 toArray 便捷方法的 ResultSet 对象。我想这可以通过其他一百万种方式完成,但是......这是有效的。
请记住,我不会在控制器中执行此操作,甚至不会以这种确切的方式执行此操作,但此时它只是一个测试。有时我希望它可用,如果需要,这就是 ZF2可以做到的。(不管好坏习惯)
在 Controller 的顶部添加/使用 ResultSet:
use Zend\Db\ResultSet\ResultSet;
Run Code Online (Sandbox Code Playgroud)
这是工作测试操作:
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;
}
Run Code Online (Sandbox Code Playgroud)
toArray 只是为你做一个 foreach 循环,所以,我想它仍然添加了我想避免的额外数组循环,但没有看过他们代码的 ZF1 版本,也许它仍然在做同样的事情。
我可能要做的是为 Zend\Db 创建一个简单的 db 包装器类,它替换 ZF1 中的 Zend_Registry 语句并添加一个 fetchAll 和 fetchOne 方法,这样我就可以更轻松地将一堆 ZF1 代码移植到 ZF2。
感谢您在评论中的输入,我很感激。:)
哦,我也想提一下。我遇到了某人创建的这个桥梁课程,这也可能有帮助:https : //github.com/fballiano/zfbridge
编辑: 所以返回的适配器结果是可迭代的。我不确定我采取了什么步骤导致了我的困惑,但 $db->query 中的结果作为 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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25400 次 |
| 最近记录: |