[FuelPHP] Insert 時に最大値(max)+1をして、その数値を取得する方法

2 min read

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