複数のユーザが共通で利用するシステムなどを作ると、カテゴリごとにオートインクリメントの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を別のフィールドにすれば応用できますね。
ビヘイビアにしてしまえば、フィールド名を引数に渡して汎用化することも簡単です。
