複数のユーザが共通で利用するシステムなどを作ると、カテゴリごとにオートインクリメントのNoを持たせたいケースがよくあります。
例えば、店舗ごとの顧客に対して1番から採番する顧客Noをもたせるといったケースです。
こういう時はModelのbeforeSaveを使ってNoを作成しています。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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を別のフィールドにすれば応用できますね。
ビヘイビアにしてしまえば、フィールド名を引数に渡して汎用化することも簡単です。