2013-02-18 14 views
7

Sono nuovo in Zend Framework 2. Ho completato con successo il tutorial Album per ZF2. Ora mi piacerebbe visualizzare solo alcuni dati da più tabelle nel database. Ho una semplice configurazione del database con tabelle, ad esempio, persona, libri, stato ... ecc. Non è davvero importante ciò che il database dovrebbe fare. Quello che vorrei sapere è se c'è un tutorial che mi mostrerà una guida passo passo per visualizzare i dati dai join della tabella. Ho visto frammenti di codici che mostrano come eseguire join, ma non ho trovato alcun tutorial sull'impostazione delle classi e su come configurare Module.php. In altre parole, il modulo in Album ha un nome di tabella codificato in getServiceConfig(). Ma come faccio a configurarlo in modo che sappia che sto richiedendo dati da più tabelle. Inoltre, se voglio impostare la relazione, creo ancora la classe per le tabelle del database come nell'esercitazione Album, o sarà qualcosa di diverso. Puoi aiutarmi, o mostrarmi la strada giusta? Se conosci qualche tutorial che spiega come gestire più tabelle, sarebbe fantastico.tabelle multiple per Zend Framework 2

risposta

5

Il tutorial di ablums utilizza Zend\Db\TableGateway che non supporta l'unione a più tabelle.

È necessario utilizzare Zend\Db direttamente o tramite una classe mapper, ad esempio AbstractDbMapper all'interno del modulo ZfcBase.

L'uso di base è simile al seguente:

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

Il metodo join() viene utilizzato per eseguire il join tra la tabella album e artist. Usiamo anche columns() per selezionare quali colonne vengono restituite. In questo caso, creo un alias chiamato a_name per la colonna name all'interno della tabella artista.

volta che l'oggetto Select è impostato, poi il resto è il codice standard Db che restituirà un oggetto ResultSet per te che contiene i dati.

+0

Grazie Rob. Darò un colpo. Nel frattempo, conosci qualche tutorial di lavoro che usa Zend \ Db. Dato che sono nuovo di Zend, mi ci vorrà un po 'per capire appieno. Sarà estremamente utile se riesco a vedere il tutorial in cui hanno usato Zend \ Db per recuperare i dati e visualizzarli. Tuttavia, grazie per il tuo aiuto. – user1828605

+0

Rob, un paio di cose non mi sono ancora chiare. Creo le classi per ogni tabella che ho? Cosa faccio in Module.php. Al momento ho la funzione pubblica getServiceConfig() nel modulo, come mostrato nell'esercitazione Album. Capisco cosa hai mostrato sopra, ma il mio problema attuale è che non so come iniziare a parlare con il database. Un tutorial sarebbe estremamente utile. Grazie – user1828605

+0

Creo le classi per ogni entità logica, che di solito si associa a una riga in una tabella, ma non sempre (a volte il mappatore si unisce sempre). Cercherò di risolvere il codice su Github. –

4

Solo per espandere la risposta eccellente di Robs, è semplice fare un ulteriore passo avanti e popolare più oggetti per formare la relazione desiderata.

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

Si dovrebbe anche guardare risultato idratante imposta per costruire gli oggetti per voi direttamente dal 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 
Problemi correlati