如何使用 DAO 检测 Yii 中事务中的最后一个插入 ID?

Posted

技术标签:

【中文标题】如何使用 DAO 检测 Yii 中事务中的最后一个插入 ID?【英文标题】:How to detect the last insert ID within a transaction in Yii using DAO? 【发布时间】:2014-07-23 17:41:06 【问题描述】:

就是源码,我需要检测ID(看下面两个查询之间的标记位置)。

$connection = Yii::app()->db;
$transaction=$connection->beginTransaction();
try 

    $q = "INSERT INTO `someTable1` .... ";      
    $connection->createCommand($q)->execute(); // Single Row Inserted

    // HERE!! How to get the last insert ID from query above

    $q = "INSERT INTO `someTable2` ....
          WHERE id = LAST_INSERT_ID_FROM_FIRST_QUERY ";
    $connection->createCommand($q)->execute();

    $transaction->commit();

 catch (Exception $e) 
    // react on exception   
    $trans->rollback();
 

最合适的方法是什么?

【问题讨论】:

您是否尝试过使用 CDbConnection 类中的 getLastInsertID()? (yiiframework.com/doc/api/1.1/…) 谢谢@AleksanderKseniya,它有效! 【参考方案1】:
$lastInsertID = $connection->getLastInsertID();

【讨论】:

这在批量插入后使用时不起作用,因为批量插入像堆栈一样工作,即使您 getLastInsertID 它返回的记录实际上是数据库中的第一个新记录 但这是另一个用例【参考方案2】:

你可以尝试两种方式,这里 getLastInsertID 是方法,lastInsertID 是属性

$lastInsertID = $connection->getLastInsertID();

$lastInsertID = $connection->lastInsertID;

更多信息http://www.yiiframework.com/doc/api/1.1/CDbConnection

【讨论】:

【参考方案3】:

我创建这个来解决这个问题

public static function getAutoIncrement($table_name)

    $q = new Query();
    $res = $q->select("AUTO_INCREMENT")
        ->from('INFORMATION_SCHEMA.TABLES')
        ->where("TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '" . $table_name . "'")
        ->one();
    if ($res)
        return $res["AUTO_INCREMENT"];
    return false;

【讨论】:

【参考方案4】:

对于任何感兴趣的人:

saveMethod 中的 ActiveRecord 是这样做的

\Yii::$app->db->schema->insert($tableName, $values)

结果是这样的

["id" => 1]

Schema 就是这样做的:

public function insert($table, $columns)

    $command = $this->db->createCommand()->insert($table, $columns);
    if (!$command->execute()) 
        return false;
    
    $tableSchema = $this->getTableSchema($table);
    $result = [];
    foreach ($tableSchema->primaryKey as $name) 
        if ($tableSchema->columns[$name]->autoIncrement) 
            $result[$name] = $this->getLastInsertID($tableSchema->sequenceName);
            break;
        

        $result[$name] = isset($columns[$name]) ? $columns[$name] : $tableSchema->columns[$name]->defaultValue;
    

    return $result;

我建议宁愿使用schema->insert。它支持复合标识符并使​​用序列名称来获取最后一个 ID

【讨论】:

以上是关于如何使用 DAO 检测 Yii 中事务中的最后一个插入 ID?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Yii 框架命令 DAO 对象进行联合所有命令

如何将 DAO 查询转换为 Yii2 ActiveRecord。如何从连接表中选择和使用特定列

Yii如何使用数据库

java - 如何在Java Spring和Hibernate的单个事务中管理2个DAO方法?

我在service层中的一个方法,调用dao层中三个方法怎么保证这三个方法事务统一

如何使用 JDBC 创建事务性 DAO