【问题标题】:ZF2 How to get last insert id value?ZF2 如何获取最后插入的 id 值?
【发布时间】:2013-04-09 17:03:12
【问题描述】:

我坚持使用 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。请不要告诉我,这么大的框架没有提供获取last insert id值的可能性!?

【问题讨论】:

  • 试试$this->tableGateway->getAdapter()->lastInsertId();
  • 致命错误:调用未定义的方法 Zend\Db\Adapter\Adapter::lastInsertId()
  • $adapter->getDriver()->getLastGeneratedValue();
  • 您也可以提供序列对象的名称:$adapter->getDriver()->getLastGeneratedValue($name)
  • @Piotr 这来自 PHP 手册:“PDO_PGSQL() 要求您为 name 参数指定序列对象的名称。”我猜对于其他驱动程序,您可以从 TableGateway 调用 getLastInsertValue()

标签: php postgresql insert frameworks zend-framework2


【解决方案1】:

这是我使用的:

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

【讨论】:

    【解决方案2】:

    我知道这是很久以前的事了,但是在花了很多时间解决这个特定问题之后,我想为未来遇到同样问题的 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");
    

    【讨论】:

    • 这是我能找到的唯一对我有用的解决方案。
    • 这对我也有用 :) 如果您想知道如何找到默认的序列名称,您可以这样做:<table_name>_<primaryKey>_seq 例如:customers_id_seq
    • 在 ZF3 中使用驱动程序 'Pdo_Pgsql' 只有你最后的解决方案有效。
    【解决方案3】:

    在 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(); 应该可以工作了。

    【讨论】:

    • 本书 Zend Framework 2.0 由示例初学者指南指出 getLastInsertValue() 返回表主键的第一个插入值。返回类型是一个整数。
    【解决方案4】:

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

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

    这对我的mysql数据库很有效

    【讨论】:

    • 最佳答案 +1,并且也会对您的其他答案 +1。
    【解决方案5】:

    在扩展 AbstractTableGatewayApp\Model\AlbumTable 中,我通过 $inserted_id = $this->lastInsertValue; 获得最后一个 id

    举个例子:

     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');
            }
    

    【讨论】:

      【解决方案6】:

      【讨论】:

        【解决方案7】:

        还有另一种可能将 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 将使用公共模式而不是在第一个参数中定义来准备查询

        SELECT NEXTVAL('user_id_seq')

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

        SELECT NEXTVAL('someSchema'.'user_id_seq')

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多