8
votes

Tables multiples pour Zend Framework 2

Je suis nouveau à Zend Framework 2. J'ai terminé avec succès le tutoriel de l'album pour ZF2. Je souhaite maintenant afficher uniquement une certaine données de plusieurs tables dans la base de données. J'ai une installation de base de données simple avec des tables, par exemple, personne, livres, statut..etc. Ce n'est vraiment pas important ce que la base de données est censée faire. Ce que j'aimerais savoir, c'est s'il y a un didacticiel qui me montrerait des directives étape par étape pour afficher les données des jointures de table. J'ai vu des extraits de codes montrant comment faire des jointures, mais je n'ai trouvé aucun didacticiel sur la configuration des classes et comment configurer le module.php. En d'autres termes, le module de l'album dispose d'un nom de table codé en dur à GetsViceconfig (). Mais comment puis-je le configurer pour qu'il sait que je demande des données à plusieurs tables? De plus, si je veux configurer la relation, puis-je créer toujours une classe pour des tables de base de données telles que dans le tutoriel de l'album, ou cela va-t-il être quelque chose de différent. Pouvez-vous s'il vous plaît aider ou me montrer le bon chemin? Si vous connaissez un tutoriel qui explique la manipulation de plusieurs tables, ce serait génial.


0 commentaires

3 Réponses :


5
votes

Le tutoriel ABLUMS utilise zend \ db \ tablegateway code> qui ne prend pas en charge la jointure à plusieurs tables.

Vous devez utiliser zend \ db code> directement ou via un mappeur classe, telle que abstractdbmapper code> dans le module ZFCBASE. p>

L'utilisation de base ressemble à ceci: p>

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


4 commentaires

Merci rob. Je vais lui donner un coup. Pendant ce temps, connaissez-vous des tutoriels de travail qui utilisent Zend \ DB. Depuis que je suis nouveau à Zend, ça va m'emmener un moment pour bien comprendre. Il sera extrêmement utile que je puisse voir le tutoriel où ils ont utilisé Zend \ dB pour récupérer des données et les afficher. Néanmoins, merci de votre aide.


Rob, couple, les choses ne me sont toujours pas claires. Est-ce que je crée des cours pour chaque tables que j'ai? Que dois-je faire dans module.php. J'ai actuellement une fonction publique GETVICECONFIG () dans le module, comme indiqué dans le tutoriel de l'album. Je comprends ce que vous avez montré ci-dessus, mais mon problème actuel est que je ne sais pas comment commencer à parler à la base de données. Un tutoriel serait extrêmement utile. Merci


Je crée des cours pour chaque entité logique - qui mappe généralement à une rangée dans une table, mais pas toujours (parfois le mapper se joint toujours). Je vais essayer de régler un code sur Github.


Dans les versions ultérieures de ZF2, il n'y a pas de méthode SetdataSource (), utilise plutôt Initialize (). Ainsi, le code ci-dessus lirait: $ Restaurants-> Initialiser ($ Driverrresult);



4
votes

Juste pour se développer sur robes excellente réponse, il est simple de prendre une étape plus loin et de remplir plusieurs objets pour former la relation que vous avez besoin.

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


0 commentaires

0
votes
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

0 commentaires