9

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 を に変更する$results->count(); と、実際にレコード数が表示されます。配列としてデータを取得するにはどうすればよいですか? (完全なレコードセット)

ある時点で、次のようなものが表示 されました。$results->current() しかし、それは単一のレコードしか返されませんでした。

補足です。使用できるすべてのテーブル抽象クラスが表示されますが、学習のこの時点では、それを実行したくありません。ZF1 で行ったように、配列を返す簡単なオンデマンド クエリが必要なだけです。ZF2 では、configs 内の「配線」が多すぎて、やり過ぎのように見えるものがあります。しかし、フレームワークとしては柔軟性が気に入っています。私が ZF1 で取り組んでいるメイン アプリは、ZF2 のモジュール性から本当に恩恵を受けることができます。(それ以外の場合は、おそらく他のフレームワークを使用します)

私の無知を許してください。助けてくれてありがとう!

4

5 に答える 5

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));
于 2013-01-07T04:05:54.277 に答える
5

わかりました、私はそれを手に入れたと思います。少なくとも、当面はこれで十分です。基本的に、追加のステップを 1 つ追加して、結果オブジェクトを toArray 簡易メソッドを持つ 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;
}

toArray は foreach ループを実行しているだけなので、回避したい余分な配列ループをまだ追加していると思いますが、コードの ZF1 バージョンを見ていないので、とにかく同じことをしているのかもしれません。

おそらく、ZF1 の Zend_Registry ステートメントを置き換えて fetchAll メソッドと fetchOne メソッドを追加する Zend\Db 用のシンプルな db ラッパー クラスを作成します。そうすれば、一連の 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;
} 
于 2013-01-02T08:18:55.410 に答える
4

長い検索の後、ZF2でSQLクエリをそのように処理します

 $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 です

于 2015-07-16T07:19:30.363 に答える
1

私の英語は非常に腐ってい ます
私もこの問題に遭遇しました。

$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 は配列です

于 2013-09-24T03:49:07.953 に答える