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

FuelPHP でインサート処理をする際に、そのテーブル内の Max+1 な ID を取得する事案があったので。

仕様

以下のようなテーブルがあった場合に ```bash +--------+----------+------------+ | 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のリストと、インサートされた レコード数を含む配列が返却される」とある。 ```php 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;
}