有另一种可能性可以将FeatureSet添加到TableGateway中。
在Module.php中,您可以定义(例如,User表)
'UserTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new UserEntity());
return new TableGateway('user', $dbAdapter, new Feature\SequenceFeature('user','user_id_seq'), $resultSetPrototype);
但是SequenceFeature存在一个bug。当您使用公共模式时,一切正常。当您需要使用其他模式时,应该使用Zend\Db\Sql\TableIdentifier;
在这种情况下,Module.php应该是:
'UserTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new UserEntity());
return new TableGateway(new TableIdentifier('user','someSchema'), $dbAdapter, new Feature\SequenceFeature(new TableIdentifier('user','someSchema'),'user_id_seq'), $resultSetPrototype);
在这种情况下,使用Postgresql查询SELECT NEXTVAL时会出现错误,因为Feature\SequenceFeature将使用公共模式而不是在第一个参数中定义的模式来准备查询。
SELECT NEXTVAL('user_id_seq')
在这种情况下,SQL查询应该是
SELECT NEXTVAL('someSchema'.'user_id_seq')
$this->tableGateway->getAdapter()->lastInsertId();
。 - phpisuber01