8

Zend Framework 2 は初めてです。ZF2 の Album チュートリアルを正常に完了しました。データベース内の複数のテーブルから特定のデータのみを表示したいと考えています。人、本、ステータスなどのテーブルを使用した単純なデータベース設定があります。データベースが何をすべきかは重要ではありません。私が知りたいのは、テーブル結合からデータを表示するための段階的なガイダンスを示すチュートリアルがあるかどうかです。結合の方法を示すコードのスニペットを見たことがありますが、クラスのセットアップや Module.php の構成方法に関するチュートリアルは見つかりませんでした。つまり、Album のモジュールには、getServiceConfig() でハードコードされた 1 つのテーブル名があります。しかし、複数のテーブルからデータを要求していることを認識するように設定するにはどうすればよいですか。また、関係を構築したい場合は、Albumチュートリアルのようにデータベーステーブルのクラスを作成しますか、それとも何か違うものになるのでしょうか。助けてもらえますか、それとも正しい道を教えてくれますか? 複数のテーブルの処理を説明するチュートリアルを知っていれば、それは素晴らしいことです。

4

3 に答える 3

5

ablums チュートリアルではZend\Db\TableGateway、複数のテーブルへの結合をサポートしていないものを使用しています。

直接、またはZfcBase モジュール内Zend\Dbなどのマッパー クラスを介して使用する必要があります。AbstractDbMapper

基本的な使用法は次のようになります。

<?php

// Given that $dbAdapter is an instance of Zend\Db\Adapter\Adapter

use Zend\Db\Sql\Select();
use Zend\Db\ResultSet\ResultSet();

$select = new Select();
$select->from('album')
   ->columns(array('album.*', 'a_name' => 'artist.name'))
   ->join('artist', 'album.artist_id' = 'artist.id');

$statement = $dbAdapter->createStatement();
$select->prepareStatement($dbAdapter, $statement);
$driverResult = $statment->execute();

$resultset = new ResultSet();
$resultset->initialize($driverResult); // can use setDataSource() for older ZF2 versions.

foreach ($resultset as $row) {
        // $row is an ArrayObject
}

このメソッドは、とテーブルjoin()の間の結合を実行するために使用されます。また、返される列を選択するためにも使用します。この場合、アーティスト テーブル内の列に対して呼び出されるエイリアスを作成します。albumartistcolumns()a_namename

Selectオブジェクトが設定されると、残りはデータを含むオブジェクトを返す標準コードですDbResultSet

于 2013-02-19T08:07:25.460 に答える
4

Robsの優れた答えを拡張するだけで、さらに一歩進んで複数のオブジェクトにデータを入力し、必要な関係を形成するのは簡単です。

<?php

// Given that $dbAdapter is an instance of Zend\Db\Adapter\Adapter

use Zend\Db\Sql\Select();
use Zend\Db\ResultSet\ResultSet();

$select = new Select();
$select->from('album')
   ->columns(array('album.*', 'artist.*'))
   ->join('artist', 'album.artist_id' = 'artist.artist_id');

$statement = $dbAdapter->createStatement();
$select->prepareStatement($dbAdapter, $statement);
$driverResult = $statement->execute(); // execute statement to get result

$resultset = new ResultSet();
$resultset->setDataSource($driverResult);

$albumHydrator = new AlbumHydrator;
$artistHydrator = new ArtistHydrator;

foreach($resultset as $row) { // $row is an ArrayObject
    $album = $albumHydrator->hydrate($row);
    $artist = $artistHydrator->hydrate($row);
    $album->setArtist($artist);
}

ResultSetから直接オブジェクトを構築するには、ハイドレイティング結果セットも確認​​する必要があります。

http://framework.zend.com/manual/2.0/en/modules/zend.db.result-set.html

于 2013-02-19T09:18:52.107 に答える
0
use Zend\Db\Sql\Select;
$select = new Select();
// or, to produce a $select bound to a specific table
// $select = new Select('foo');

$select->join(
     'foo' // table name,
     'id = bar.id', // expression to join on (will be quoted by platform object before insertion),
     array('bar', 'baz'), // (optional) list of columns, same requiremetns as columns() above
     $select::JOIN_OUTER // (optional), one of inner, outer, left, right also represtned by constants in the API
);

$select->from(array('f' => 'foo'))  // base table
    ->join(array('b' => 'bar'),     // join table with alias
    'f.foo_id = b.foo_id');         // join expression
于 2013-08-01T05:08:34.853 に答える