从同一个控制器文件访问 2 个不同的表
Accessing 2 different tables from same controller file
我已成功完成 Zend Framework 2 手册中的专辑 table 教程。我已经使用 table 网关实现了。我可以看到他只使用了一个名为"album"的table,因此他根据那个table实现了。
假设我有另一个名为 "artist" 的 table,它包含来自 "album" table 的每位艺术家的信息。
现在在手册中,他只需使用:
$this->getAlbumTable()->fetchAll();
现在我想用 "artists" table 做类似的事情,这样我的查询就可以像这样:
$this->getArtistsTable()->fetchAll();
那么我应该更改或添加什么??我已经在 mySql 中创建了艺术家 table,其中包含以下列:姓名、出生日期、国家/地区。
P.S:我不会使用连接或任何 atm。只想访问同一控制器(同一模块)中的第二个 table。
解决方案:
在 Venca 的帮助下,我解决了这个问题:这里是你应该如何编辑 2 tables 和更多的出厂设置。
public function getServiceConfig()
{
// Given in Manual
return array(
'factories' => array(
'Album\Model\AlbumTable' => function($sm) {
$tableGateway = $sm->get('AlbumTableGateway');
$table = new AlbumTable($tableGateway);
return $table;
},
'AlbumTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Album());
return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
},
// Added another table named Artist
'Album\Model\ArtistTable' => function($sm) {
$tableGateway = $sm->get('ArtistTableGateway');
$table = new AlbumTable($tableGateway);
return $table;
},
'ArtistTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Artist());
return new TableGateway('artist', $dbAdapter, null, $resultSetPrototype);
},
),
);
}
现在您可以从控制器访问两个 table。问题解决了。度过愉快的一天。
根据manual
- 创建模型
- 创建模型table
将工厂添加到您的模块
return array(
'factories' => array(
'Album\Model\ArtistTable' => function($sm) {
$tableGateway = $sm->get('ArtistTableGateway');
$table = new ArtistTable($tableGateway);
return $table;
},
'ArtistTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Artist());
return new TableGateway('artist', $dbAdapter, null, $resultSetPrototype);
},
),
);
我已成功完成 Zend Framework 2 手册中的专辑 table 教程。我已经使用 table 网关实现了。我可以看到他只使用了一个名为"album"的table,因此他根据那个table实现了。
假设我有另一个名为 "artist" 的 table,它包含来自 "album" table 的每位艺术家的信息。
现在在手册中,他只需使用:
$this->getAlbumTable()->fetchAll();
现在我想用 "artists" table 做类似的事情,这样我的查询就可以像这样:
$this->getArtistsTable()->fetchAll();
那么我应该更改或添加什么??我已经在 mySql 中创建了艺术家 table,其中包含以下列:姓名、出生日期、国家/地区。
P.S:我不会使用连接或任何 atm。只想访问同一控制器(同一模块)中的第二个 table。
解决方案: 在 Venca 的帮助下,我解决了这个问题:这里是你应该如何编辑 2 tables 和更多的出厂设置。
public function getServiceConfig()
{
// Given in Manual
return array(
'factories' => array(
'Album\Model\AlbumTable' => function($sm) {
$tableGateway = $sm->get('AlbumTableGateway');
$table = new AlbumTable($tableGateway);
return $table;
},
'AlbumTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Album());
return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
},
// Added another table named Artist
'Album\Model\ArtistTable' => function($sm) {
$tableGateway = $sm->get('ArtistTableGateway');
$table = new AlbumTable($tableGateway);
return $table;
},
'ArtistTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Artist());
return new TableGateway('artist', $dbAdapter, null, $resultSetPrototype);
},
),
);
}
现在您可以从控制器访问两个 table。问题解决了。度过愉快的一天。
根据manual
- 创建模型
- 创建模型table
将工厂添加到您的模块
return array( 'factories' => array( 'Album\Model\ArtistTable' => function($sm) { $tableGateway = $sm->get('ArtistTableGateway'); $table = new ArtistTable($tableGateway); return $table; }, 'ArtistTableGateway' => function ($sm) { $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); $resultSetPrototype = new ResultSet(); $resultSetPrototype->setArrayObjectPrototype(new Artist()); return new TableGateway('artist', $dbAdapter, null, $resultSetPrototype); }, ), );