ZF2如何获取最后一次插入id值?

时间:2013-04-09 17:03:13

标签: php postgresql insert frameworks zend-framework2

我坚持使用Zend框架2获取最后一个插入ID并且我放弃了这个......

尝试过组合:

var_dump($this->tableGateway->insert($insert));
var_dump($this->tableGateway->lastInsertValue);
var_dump($this->tableGateway->getLastInsertValue());
var_dump($this->tableGateway->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue());

值是插入表,但每行(除了第一个,它给出int" 1")返回null。请不要告诉我,这么大的框架不能提供获取最后一次插入id值的可能性!?

7 个答案:

答案 0 :(得分:27)

以下是我使用的内容:

$data = array()// Your data to be saved;
$this->tableGateway->insert($data);
$id = $this->tableGateway->lastInsertValue;

答案 1 :(得分:7)

我知道这是一段时间了,但是在花了大量时间处理这个特定问题之后,我想为未来的Google员工发布遇到同样问题的解决方案。

问题是Pgsql驱动程序需要序列的名称来返回最后一个id,如下所示:

$adapter->getDriver()->getLastGeneratedValue("sequence_name");

这适用于2.3.1。 2.2.2(可能更晚)中有一个错误,其中name不是驱动程序中getLastGeneratedValue的参数,因此您必须直接调用该连接。

$adapter->getDriver()->getConnection()->getLastGeneratedValue

这就是我通过查看代码找到的内容。最佳解决方案是确保更新ZF2,并使用

$adapter->getDriver()->getLastGeneratedValue("sequence_name");

答案 2 :(得分:4)

在postgres中,您需要设置SequenceFeature:

...
use Zend\Db\TableGateway\Feature;
...
public function setDbAdapter( Adapter $adapter ) {
   ...
   $this->featureSet = new Feature\FeatureSet();
   $this->featureSet->addFeature(new Feature\SequenceFeature('YOUR_FIELD_NAME','YOUR_SEQUENCE_NAME'));
   $this->initialize();
}

现在$this->tableGateway->getLastInsertValue();应该有效。

答案 3 :(得分:4)

好的,我知道这个问题已经过了几个月了,不过对于那些正在寻找这个问题的解决方案来获取最后一个插入值的人来说,最好的方法是从适配器接口获取值,这可能是有用的。 p>

do your insert //then
$id = $adapter->getDriver()->getLastGeneratedValue();

这适用于我的mysql数据库

答案 4 :(得分:1)

App\Model\AlbumTable AbstractTableGateway $inserted_id = $this->lastInsertValue; if ($id == 0) { $this->insert($data); $inserted_id = $this->lastInsertValue; } elseif ($this->getAlbum($id)) { $this->update( $data, array( 'id' => $id, ) ); } else { throw new \Exception('Form id does not exist'); } {{1}}

作为一个例子:

{{1}}

答案 5 :(得分:0)

答案 6 :(得分:0)

还有另一种方法可以将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中有一个错误。当您使用公共架构时,一切都很好。当您必须使用其他模式时,您应该使用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将使用公共模式而不是在第一个参数中定义来准备查询

选择NEXTVAL(' user_id_seq')

在这种情况下,sql查询应该是

选择NEXTVAL(' someSchema'。' user_id_seq')