2013-02-18 19 views
7

Jestem nowy w Zend Framework 2. Z powodzeniem ukończyłem samouczek do albumu dla ZF2. Teraz chciałbym wyświetlić tylko niektóre dane z wielu tabel w bazie danych. Mam prostą konfigurację bazy danych z tabelami, na przykład: osoba, książki, status..etc. Naprawdę nie jest ważne, co powinna robić baza danych. Chciałbym wiedzieć, czy istnieje samouczek, który pokazuje krok po kroku wskazówki do wyświetlania danych z dołączeń do tabeli. Widziałem fragmenty kodów pokazujące, jak robić sprzężenia, ale nie znalazłem żadnych tutoriali na temat konfigurowania klas i konfigurowania Module.php. Innymi słowy, moduł w albumie ma jedną nazwę tabeli zakodowaną na stałe w getServiceConfig(). Ale jak to skonfigurować, aby wiedział, że żądam danych z wielu tabel. Ponadto, jeśli chcę ustawić relację, czy nadal tworzę klasę dla tabel bazy danych, jak w samouczku Albumu, czy też będzie to coś innego. Czy możesz mi pomóc lub pokazać mi właściwą drogę? Jeśli znasz jakiś samouczek wyjaśniający obsługę wielu tabel, byłoby świetnie.wiele tabel dla Zend Framework 2

Odpowiedz

5

Samouczek ablums używa Zend\Db\TableGateway, który nie obsługuje łączenia z wieloma tabelami.

Musisz użyć bezpośrednio lub za pomocą klasy mapper, na przykład AbstractDbMapper w module ZfcBase.

Podstawowe użycie wygląda następująco:

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

Sposób join() służy do wykonywania sprzężenia między stołem album i artist. Używamy również columns(), aby wybrać, które kolumny są zwracane. W takim przypadku tworzę alias o nazwie a_name dla kolumny name w tabeli wykonawców.

Po ustawieniu obiektu Select, reszta to standardowy kod Db, który zwróci obiekt ResultSet dla Ciebie zawierający dane.

+0

Thanks Rob. Dam ci szansę. Tymczasem znasz jakieś działające samouczki używające Zend \ Db. Odkąd jestem nowy w Zend, pełne zrozumienie zajmie mi trochę czasu. Będzie bardzo pomocne, jeśli zobaczę samouczek, w którym użyli Zend \ Db do pobierania danych i wyświetlania ich. Niemniej dziękuję za pomoc. – user1828605

+0

Rob, kilka rzeczy wciąż nie jest dla mnie jasne. Czy tworzę klasy dla wszystkich posiadanych stołów? Co mam zrobić w Module.php. Obecnie mam publiczną funkcję getServiceConfig() w module, jak pokazano w samouczku do albumu. Rozumiem, co pokazałeś powyżej, ale moim obecnym problemem jest to, że nie wiem, jak zacząć rozmawiać z bazą danych. Samouczek byłby niezwykle pomocny. Dzięki – user1828605

+0

Tworzę klasy dla każdej jednostki logicznej - która zazwyczaj jest mapowana do wiersza w tabeli, ale nie zawsze (czasami zawsze dołącza się program odwzorowujący). Spróbuję znaleźć jakiś kod na Githubie. –

4

Po to, aby rozwinąć doskonałą odpowiedź dla Robsa, można łatwo zrobić krok naprzód i wypełnić wiele obiektów, aby uzyskać pożądany związek.

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

Należy również spojrzeć na skutek nawilżającym zestawy do budowy obiektów dla Ciebie bezpośrednio z 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