[FuelPHP] Insert 時に最大値(max)+1をして、その数値を取得する方法
FuelPHP でインサート処理をする際に、そのテーブル内の Max+1 な ID を取得する事案があったので。
仕様
以下のようなテーブルがあった場合に
+--------+----------+------------+
| col_id | col_name | date |
+--------+----------+------------+
| 1 | test | 1969-01-29 |
+--------+----------+------------+
id
は「最大値+ 1 (max+1)」の値をもってインサート処理
新しく取得したid
は別の処理で使う
余談
通常の SQL の場合の Max+1 の ID 取得方法
「連番を INSERT と同時に挿入する方法」で以前書いた通り、
INSERT INTO テーブル名( 連番を入れるカラム, EXAMPLE_ID, EXAMPLE_NAME )
SELECT COALESCE(MAX(連番を入れるカラム)+1,1), ?, ?
FROM テーブル名;
こんな感じでいける。
FuelPHP Insert()の戻り値について
ドキュメントに以下のような Inset の場合に「インサートされた ID のリストと、インサートされた レコード数を含む配列が返却される」とある。
list($insert_id, $rows_affected) = DB::insert('users')->set(array(
'name' => 'John Random',
'email' => 'john@example.com',
'password' => 's0_s3cr3t',
))->execute();
ただし、この戻り値の「インサートされた ID」はAUTO_INCREMENT
の話なので、そうでない場合は意味をなさない。
方法
綺麗な方法とは言えないが、とりあえずは以下のようなコードで最新のid
をインサートしつつ取得できる。
(もう少し綺麗な方法が見つかれば追記したい)
public static function insert_col(){
$record_no = 0;
\DB::insert('TABLE')
->columns(array(
'col_no',
'col_name',
'col_date',
))
->values(array(
$record_no = \DB::select(\DB::expr('COALESCE(MAX(col_no)+ 1, 1) as max_plus'))->from('TABLE')->execute()->current()['max_plus'],
'test',
'2015-01-29',
))
->execute();
return $record_no;
}