getInsertID()とgetLastInsertID() という関数。
2つあるらしく。
CakePHP:getLastInsertIDって、どうよ(PHP)–WEBシステム開発 技術的備忘録(通称 技忘録)
何してるのかわからんかったので調べた。
from cake/libs/model/model.php :
function getLastInsertID() {
return $this->getInsertID();
}
ヽ(`Д´)ノもう来ねぇよウワァァァァン
というわけで気をとりなおして、getInsertID()。
function getInsertID() {
return $this->__insertID;
}
modelクラス変数 $__insertID を見に行ってるのね。
そんなわけで、$__insertID を探したら・・・
function setInsertID($id) {
$this->__insertID = $id;
}
・・・。
ヽ(`Д´)ノもう来ねぇよウワァァァァン
またまた気を取り直して。
ちなみに、setInsertID は、データソースのほうで使用してます。
cake/libs/model/datasources/dbo_source.php
function create(&$model, $fields = null, $values = null) {
// 中略
if ($this->execute($this->renderStatement('create', $query))) {
if (empty($id)) {
$id = $this->lastInsertId($this->fullTableName($model, false),
$model->primaryKey);
}
$model->setInsertID($id);
// 以下略
そして、lastInsertID は各DBによって違う挙動となります。
一番最後に挿入したレコードのidを取得する方法はRDBMSによってまちまちですからね。
MySQLの場合:datasources/dbo/dbo_mysql.php
function lastInsertId($source = null) {
$id = $this->fetchRow('SELECT LAST_INSERT_ID() AS insertID', false);
// 以下略
つまり、LAST_INSERT_ID() の値。
PostgreSQLの場合:datasources/dbo/dbo_postgres.php
function lastInsertId($source, $field = 'id') {
$seq = $this->getSequence($source, $field);
$data = $this->fetchRow("SELECT currval('{$seq}') as max");
return $data[0]['max'];
$seq というのはシーケンスの名前。
詳しくはPostgreSQLのシーケンス操作関数あたり参照。