【CakePHP・MySQL】CakePHP2 + MySQLでシーケンステーブルを使ってみる。
2019/06/11
tableA を使用する処理Aで、日付や作成者IDなどを組み合わせた発注番号的なコードを発番する処理を作成。
単独の機能だったので、tableA の AUTO_INCREMENT を利用して発番していましたが、機能追加で処理Bからも処理Aで発番していたコードが必要になり、AUTO_INCREMENT が使えない事態になったので、発番用にシーケンステーブルを使うことにしたので、その内容を備忘録してポストします。
CakePHPのバージョンは2.3.10です。
CakePHP + MySQLでシーケンス
PostgreSQLでは機能として"シーケンステーブル"があるのですが、残念ながら MySQL では無いので、
似たような事をする場合はひと手間が必要となります。
シーケンステーブル作成
ということで、まずはシーケンス用のテーブルを作成。
"id"カラムのみのテーブルです。
1 2 3 |
CREATE TABLE IF NOT EXISTS `sequences`( id BIGINT(20) NOT NULL ) TYPE = InnoDB DEFAULT CHARSET=utf8; |
Sequenceモデル作成
シーケンステーブル用のモデルファイルを作成。
モデル内に、カウントアップ用のルーチンを組み込みます。
カウントアップし、その結果を返す仕様です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class Sequence extends AppModel { var $name = 'Sequence'; /** * シーケンス番号のカウントアップ * */ public function nextval_sequence() { // カウントアップ $sql = 'UPDATE outsideorder_sequences SET id = LAST_INSERT_ID(id+1)'; $params = array(); $this->query($sql, $params); // 取得 $sql = 'SELECT LAST_INSERT_ID()'; $params = array(); $currentval_sequence_data = $this->query($sql, $params); return $currentval_sequence_data; } } |
AppController.php
AppController に、上記モデルのカウントアップをキックするアクションを作成します。
1 2 3 4 5 6 7 8 9 |
/** * シーケンス カウントアップ */ public function _getNextValSequence() { // カウントアップ及び取得 $nextVal = $this->Sequence->nextval_sequence(); return $nextVal; } |
使い方
最後に、実際に発番する処理を作成。
例えば、OrdersController などで使う場合です。
1 2 |
// app_controllerのアクションで シーケンス NextVal 取得 $nextValSequence = $this->_getNextValSequence(); |
ダンプしてみると、以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 |
pr($nextValSequence) Array ( [0] => Array ( [0] => Array ( [LAST_INSERT_ID()] => 1 ) ) ) |
いい感じにカウントアップされていますね。
同時接続が少い処理なので、あまり何も考えずに作ってしまいましたが、
とりあえずは一度運用してみて、様子を見たいと思います。
果たして使用に耐え得るのか。