2013-02-18 16 views
7

Ich bin neu in Zend Framework 2. Ich habe das Album-Tutorial für ZF2 erfolgreich abgeschlossen. Jetzt möchte ich nur bestimmte Daten aus mehreren Tabellen in der Datenbank anzeigen. Ich habe eine einfache Datenbank-Setup mit Tabellen, z. B. Person, Bücher, Status .. etc. Es ist wirklich nicht wichtig, was die Datenbank tun soll. Was ich gerne wissen würde, ist, wenn es ein Tutorial gibt, das mir Schritt-für-Schritt-Anleitungen zeigt, um Daten von Tabellen-Joins anzuzeigen. Ich habe Codeschnipsel gesehen, die zeigen, wie Joins zu machen sind, aber ich habe keine Tutorials zum Einrichten der Klassen und zum Konfigurieren von Module.php gefunden. Mit anderen Worten, das Modul in Album hat einen Tabellennamen, der in getServiceConfig() fest codiert ist. Aber wie richte ich es so ein, dass es weiß, dass ich Daten von mehreren Tabellen anfordere. Wenn ich die Beziehung einrichten möchte, erzeuge ich immer noch eine Klasse für Datenbanktabellen, wie im Lernprogramm für Alben, oder wird es etwas anderes sein. Kannst du mir bitte helfen oder mir den richtigen Weg zeigen? Wenn Sie ein Tutorial kennen, das den Umgang mit mehreren Tabellen erklärt, wäre das großartig.mehrere Tabellen für Zend Framework 2

Antwort

5

Das Ablums-Lernprogramm verwendet Zend\Db\TableGateway, das das Verbinden mit mehreren Tabellen nicht unterstützt.

Sie müssen Zend\Db direkt oder über eine Mapper-Klasse wie AbstractDbMapper innerhalb des ZfcBase-Moduls verwenden.

Die grundlegende Verwendung sieht wie folgt aus:

<?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 
} 

Die join() Methode der Verbindung zwischen dem album und artist Tabelle auszuführen verwendet wird. Wir verwenden auch columns(), um auszuwählen, welche Spalten zurückgegeben werden. In diesem Fall erstelle ich einen Alias ​​namens a_name für die Spalte name in der artist-Tabelle.

Sobald das Objekt Select eingerichtet ist, ist der Rest der Standardcode Db, der ein ResultSet Objekt für Sie zurückgibt, das die Daten enthält.

+0

Dank Rob. Ich versuche es mal. Inzwischen kennen Sie irgendwelche Arbeit Tutorien, die Zend \ Db verwendet. Da ich neu bei Zend bin, brauche ich eine Weile, um es zu verstehen. Es wird sehr hilfreich sein, wenn ich das Tutorial sehen kann, in dem sie Zend \ Db verwendet haben, um Daten abzurufen und anzuzeigen. Trotzdem, danke für Ihre Hilfe. – user1828605

+0

Rob, paar Dinge noch nicht klar für mich. Erstelle ich Klassen für jede Tabelle, die ich habe? Was mache ich in Module.php? Ich habe zur Zeit die öffentliche Funktion getServiceConfig() in Module, wie im Album Tutorial gezeigt. Ich verstehe, was Sie oben gezeigt haben, aber mein derzeitiges Problem ist, dass ich nicht weiß, wie ich anfangen soll, mit der Datenbank zu sprechen. Ein Tutorial wäre sehr hilfreich. Danke – user1828605

+0

Ich erstelle Klassen für jede logische Entität - die normalerweise einer Zeile in einer Tabelle zugeordnet wird, aber nicht immer (manchmal verbindet der Mapper immer). Ich werde versuchen, Code auf Github zu sortieren. –

4

Nur um Robs ausgezeichnete Antwort zu erweitern, ist es einfach, einen Schritt weiter zu gehen und mehrere Objekte zu bevölkern, um die gewünschte Beziehung zu bilden.

<?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); 
} 

Sie auch auf feuchtigkeitsspendende Ergebnis aussehen soll setzt Ihre Objekte für Sie direkt aus dem ResultSet zu bauen:

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