我是Zend Framework 2的新手。我成功完成了ZF2的专辑教程。现在我想只显示数据库中多个表的某些数据。我有一个简单的数据库设置与表,例如,人,书,status..etc。数据库应该做什么并不重要。我想知道的是,是否有一个教程可以向我展示从表连接中显示数据的分步指导。我已经看到代码片段显示了如何进行连接,但是我没有找到有关设置类的任何教程,以及如何配置Module.php。换句话说,相册中的模块在getServiceConfig()中有一个硬编码的表名。但是如何设置它以便它知道我正在从多个表中请求数据。另外,如果我想设置关系,我是否仍然为Album教程中的数据库表创建类,或者它是否会有所不同。你能帮忙,还是给我指路?如果您知道任何解释处理多个表的教程,那就太棒了。
答案 0 :(得分: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()
方法用于执行album
和artist
表之间的连接。我们还使用columns()
来选择返回的列。在这种情况下,我为艺术家表格中的a_name
列创建了一个名为name
的别名。
设置Select
对象后,其余的是标准Db
代码,它将为您返回包含数据的ResultSet
对象。
答案 1 :(得分: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
答案 2 :(得分: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