シェアする

  • このエントリーをはてなブックマークに追加

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

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

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

シェアする

  • このエントリーをはてなブックマークに追加

フォローする