2013-02-18 19 views
7

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

答えて

5

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

Zend\Dbを直接使用するか、ZfcBaseモジュール内の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()方法がalbumartistテーブル間の結合を実行するために使用されます。 columns()を使用して、返される列を選択します。この場合、アーティストテーブル内のname列の別名a_nameを作成します。

Selectオブジェクトが設定されると、残りのデータはDb標準のコードとなり、データを含むオブジェクトがResultSetに返されます。

+0

おかげでロブ。私はそれを撃つだろう。一方、Zend \ Dbを使用する作業チュートリアルについて知っていますか?私はZendには初めての人なので、完全に理解するにはしばらく時間がかかります。 Zend \ Dbを使ってデータを取り出して表示するチュートリアルを見ることができれば、非常に役に立ちます。それにもかかわらず、あなたの助けに感謝します。 – user1828605

+0

ロブ、カップルのことはまだ私には明らかではありません。私が持っているテーブルごとにクラスを作成しますか? Module.phpで何をしますか?私は現在、モジュールチュートリアルに示されているように、モジュール内にpublic function getServiceConfig()を持っています。私はあなたが上に示したことを理解していますが、私の現在の問題は、データベースとの会話を始める方法がわからないことです。チュートリアルは非常に役に立ちます。ありがとう – user1828605

+0

私は論理エンティティごとにクラスを作成します。通常、テーブル内の行にマッピングされますが、必ずしもそうではありません(マッパーは常に結合することがあります)。私はGithubでいくつかのコードを整理しようとします。 –

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

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 
関連する問題