8

我是 Zend Framework 2 的新手。我成功完成了 ZF2 的专辑教程。现在我想只显示数据库中多个表中的特定数据。我有一个带有表格的简单数据库设置,例如人员、书籍、状态等。数据库应该做什么并不重要。我想知道的是,是否有一个教程可以向我展示显示表连接数据的分步指南。我已经看到了显示如何进行连接的代码片段,但我还没有找到任何关于设置类以及如何配置 Module.php 的教程。换句话说,Album 中的模块在 getServiceConfig() 中有一个硬编码的表名。但是我该如何设置它才能知道我正在从多个表中请求数据。另外,如果我想建立关系,我是否仍然像专辑教程中那样为数据库表创建类,还是会有所不同。你能帮忙,或者告诉我正确的路径吗?如果您知道任何解释处理多个表的教程,那就太好了。

4

3 回答 3

5

alums 教程使用Zend\Db\TableGateway不支持加入多个表。

您需要Zend\Db直接使用或通过映射器类使用,例如AbstractDbMapper在 ZfcBase 模块中。

基本用法如下所示:

<?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()选择返回哪些列。a_name在这种情况下,我为艺术家表中的name列创建了一个别名。

一旦Select设置了对象,剩下的就是标准Db代码,它将ResultSet为您返回一个包含数据的对象。

于 2013-02-19T08:07:25.460 回答
4

只是为了扩展 Rob 的出色答案,更进一步并填充多个对象以形成您需要的关系很简单。

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

于 2013-02-19T09:18:52.107 回答
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
于 2013-08-01T05:08:34.853 回答