複数のユーザが共通で利用するシステムなどを作ると、カテゴリごとにオートインクリメントのNoを持たせたいケースがよくあります。
例えば、店舗ごとの顧客に対して1番から採番する顧客Noをもたせるといったケースです。
こういう時はModelのbeforeSaveを使ってNoを作成しています。
public function beforeSave($options = array()) { if (empty($this->data[$this->alias]['id']) && empty($this->data['id'])) { if (!empty($this->data[$this->alias])) { $shopId = $this->data[$this->alias]['shop_id']; } else { $shopId = $this->data['shop_id']; } // no自動設定 $maxNo = $this->find('first', array( 'fields' => array( 'MAX(no) as max_no', ), 'conditions' => array( 'shop_id' => $shopId, ), )); $nextNo = $maxNo[0]['max_no'] + 1; if (!empty($this->data[$this->alias])) { $this->data[$this->alias]['no'] = $nextNo; } else { $this->data['no'] = $nextNo; } } return true; }
shop_idを指定してnoの最大値を取得して、インクリメント値をnoにセットしています。
shop_idを別のフィールドにすれば応用できますね。
ビヘイビアにしてしまえば、フィールド名を引数に渡して汎用化することも簡単です。