如何使用 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 DAO 查询转换为 Yii2 ActiveRecord。如何从连接表中选择和使用特定列
java - 如何在Java Spring和Hibernate的单个事务中管理2个DAO方法?