Zend Framework 2 Db \ Adapter \ Adapter查询结果集,如ZF1

时间:2013-01-01 01:51:25

标签: 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;
}

在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的模块化。 (否则我可能会选择其他框架)

请原谅我的无知,非常感谢你的帮助!

5 个答案:

答案 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是数组