17

我坚持使用 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 值的可能性!?

4

7 回答 7

28

Here is what I use:

$data = array()// Your data to be saved;
$this->tableGateway->insert($data);
$id = $this->tableGateway->lastInsertValue;
于 2013-06-08T19:41:12.017 回答
9

我知道这是很久以前的事了,但是在花了很多时间解决这个特殊问题之后,我想为未来遇到同样问题的谷歌员工发布解决方案。

问题是 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");
于 2014-06-04T17:43:36.747 回答
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();应该可以了。

于 2013-04-20T17:40:41.100 回答
3

好的,我知道这个问题是几个月前的问题,尽管它可能对那些正在寻找解决这个问题的人有用,以获取最后的插入值最好的方法是从适配器接口获取值

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

这对我来说很适合mysql数据库

于 2013-12-05T15:26:23.570 回答
1

App\Model\AlbumTable哪个扩展中,AbstractTableGateway我得到最后一个 id$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');
        }
于 2013-11-22T13:30:47.507 回答
0

这不适用于 oracle oci8,因为它尚未实现。见这里:https ://github.com/zendframework/zf2/blob/master/library/Zend/Db/Adapter/Driver/Oci8/Connection.php#L343

于 2013-08-17T16:59:58.147 回答
0

还有另一种可能将 FeatureSet 添加到 TableGateway。

在 Module.php 中,您可以定义(例如表用户)

            '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查询应该是

SELECT NEXTVAL('someSchema'.'user_id_seq')

于 2016-12-14T14:06:01.860 回答