2013-01-01 11 views
9

ZF2の単純なデータベースクエリを理解するだけでよい。 ZF1では、次のような簡単な方法があります。Zend Framework 2 Db Adapter Adapterクエリ結果、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のような配列です。後で反復処理する必要がある配列を後で提供するためにのみ結果オブジェクトを反復処理しなければならない場合、それはちょっとした労力の重複のように思えます。

はとにかく、ここで私はこれまで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では、過度のように見える設定やものには、あまりにも多くの「配線」があるようです。しかし、フレームワークとして、私は柔軟性が欲しく、私がZF1で取り組んでいる主なアプリケーションは、ZF2のモジュール性から本当に恩恵を受ける可能性があります。 (そうでなければ、おそらく他のフレームワークと一緒に行くだろう)

私の無知を許してください、ありがとうございました!

+0

Loあなたは 'Zend \ Db \ Adapter \ Driver \ Pdo \ Result'に' fetchAll'のようなメソッドを探しましたか?さもなければ、実行したPDOStatementと同じように '$ result'をループする必要があります。 – prodigitalson

+0

ええ、私は文書を見て: [リンク] http://framework.zend.com/apidoc/2.0/classes/Zend.Db.Adapter.Driver.Pdo.Result.html [/リンク] しかし、その唯一の"current()"という配列を返す1つのメソッドを示します。そしてそれはただ一つのレコードを返します。あまりにも - > toArray()メソッドまたはそれに類するものがありません。 ZF2で抽象クラスを使わずにレコードセットを返す方法がないとは思えません。 – gregthegeek

+0

よくこのレベルでは配列を必要としません...mysqliresult resrouceやPDOStatementのような実際の結果セットが必要なのは、あなたがループしているからです。 fetchAllを使用することは、通常は良い習慣ではありませんが、場合によっては便利です。おそらく '$ result-> getResource() - > fetchAll(PDO :: FETCH_ASSOC)'を実行して回避することができます。全体的なIDは2.xや1.xでZend_Dbを絶対に推奨しません...代わりにidはDoctrine -DDBALを使って、必要ならば抽象化や完全なORMを望みます。 – prodigitalson

答えて

4

私はそれを持っていると思います。少なくともこれは当分の間仕事をします。基本的には、追加のステップを1つ追加し、結果オブジェクトをtoArrayの便利メソッドを持つResultSetオブジェクトに渡す必要があります。これは何百万もの他の方法で行うことができると思いますが、これはうまくいきます。

コントローラでこれを行うのではなく、この正確な方法でもこれを行うわけではありませんが、この時点での唯一のテストです。私はこれが利用可能になる時があります、そして、これはZF2 ができる方法です。希望する場合はそれを行います。 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のをやっている:

use Zend\Db\ResultSet\ResultSet; 

ここでの作業テスト・アクションです私は避けたかったが、ZF1版のコードを見ていない余分な配列ループを追加していると思います。

Zend1のZend_Registryステートメントを置き換えるZend \ Db用の簡単なdbラッパークラスを作成し、fetchAllメソッドとfetchOneメソッドを追加すると、ZF1コードの束をZF2コードにすばやく移植できますより簡単に。

ご意見ありがとうございました。ありがとうございます。:)

ああ、私も言及したかった。また、私は役に立つかもしれません作成し、このブリッジクラスの誰か、に走った: https://github.com/fballiano/zfbridge

EDIT: だから、返さアダプタの結果は反復可能ですそれが判明します。私は私の混乱につながったどのような手順を取ったか分からないが、$ db->クエリの結果はPdo \ Resultオブジェクトとして返され、foreachで十分に簡単にループすることができます。あなたがそれをvar_dumpすれば、配列データは表示されず、オブジェクトだけが表示されます。それが私を完全に混乱させる道に導いた。

ここで、たとえ上記のように動作していても、これはより良いIMOです。そのオブジェクトを取得して、後で繰り返したい場所に送信できるからです。 (最初に配列を作成するために全部をループするのではなく、別のループを繰り返すだけで時間の無駄を省きます)

ここでは良い例があります。オブジェクトをループするだけで、あなたのデータがあります!やあ!時には単純なことをどうやって逃すかわからない。 :) http://framework.zend.com/manual/2.0/en/modules/zend.db.result-set.htmlから

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; 
} 
8

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

私の英語は$、私もこの問題が発生した非常に腐っ
ですreturnTypeはZend \ Db \ ResultSet \ ResultSetに定義されています
Zend \ Db \ Adapter \ Adapterの3番目の引数を与えることができます。

$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があなたが次の操作を行って、foreachループを回避することができ、アレイ

+0

非常に良いヒントは、心に留めておく!どうも! – gregthegeek

2

です:

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

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

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

これが最良の方法です。 –

3

長い検索の後、私は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

関連する問題