Zend框架2 dB的\\ \\适配器适配器查询结果集像ZF1(Zend Framework 2 D

2019-08-05 04:21发布

只需要一只手理解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的模块化受益。 (否则,我可能会跟其他的框架去)

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

Answer 1:

从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));


Answer 2:

好吧,我想我已经得到了它。 至少,这将暂时做的工作。 基本上,你必须添加一个额外的步骤和将结果对象插入具有指定者简便方法。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;
} 


Answer 3:

漫长的探索后,我韩德尔我的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



Answer 4:

您可以通过执行以下操作避免foreach循环:

$statement = $db->query($sql);

/** @var $results Zend\Db\ResultSet\ResultSet */
$results = $statement->execute();

$data = $result->getResource()->fetchAll();
// Now data is an array


Answer 5:

我的英语非常烂
我也遇到了这个问题,$返回类型定义在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是数组



文章来源: Zend Framework 2 Db\\Adapter\\Adapter query resultset like ZF1