2013-02-18 35 views
7

我是Zend Framework 2的新手。我成功完成了ZF2的Album教程。現在我想只顯示數據庫中多個表中的某些數據。我有一個簡單的數據庫設置與表,例如,人,書籍,狀態..等等。數據庫應該做什麼並不重要。我想知道的是,如果有一個教程會向我展示顯示錶連接數據的分步指導。我已經看到代碼片段展示瞭如何進行連接,但是我還沒有找到關於設置類的教程,以及如何配置Module.php。換句話說,相冊中的模塊在getServiceConfig()中有一個硬編碼的表名。但我如何設置它,以便知道我正在從多個表中請求數據。另外,如果我想設置關係,還是像在Album教程中那樣爲數據庫表創建類,還是會有些不同。你能幫忙,還是告訴我正確的道路?如果你知道解釋處理多個表的任何教程,那就太好了。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 2013-02-20 18:11:19

+0

羅布,夫婦的事情仍然不清楚。我是否爲每個表創建類?我在Module.php中做什麼?我現在在Module中有公共函數getServiceConfig(),如Album tutorial所示。我明白你上面顯示的內容,但是我目前的問題是我不知道如何開始與數據庫交談。教程將非常有幫助。謝謝 – user1828605 2013-02-21 20:51:10

+0

我爲每個邏輯實體創建類 - 通常映射到表中的一行,但並不總是(有時映射器總是加入)。我會嘗試在Github上解決一些代碼。 – 2013-02-25 23:02:39

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