[CakePHP]モデルでカテゴリごとのインクリメントNoを自動保存する

複数のユーザが共通で利用するシステムなどを作ると、カテゴリごとにオートインクリメントの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を別のフィールドにすれば応用できますね。

ビヘイビアにしてしまえば、フィールド名を引数に渡して汎用化することも簡単です。

スポンサーリンク
336x280_1
336x280_1

シェアする

フォローする

スポンサーリンク
336x280_1