スポンサードリンク

cake-logo
cake-logo

ようやく、動きがつかめてきた感じのCakePHP

まだまだ奥が深いです。

でも、面白いですね。

さて、今回は論理削除をしたときに

アソシエーションしているモデルも論理削除させることをしました。

少々、強引ですが・・・

スポンサードリンク

強引な論理削除の方法

内容としては、削除の動きをした後で

アソシエーションモデルを論理削除のように

saveしてしまえということです。

Postモデル →hasMany→ UserPostモデルの場合

public function delete($id = null) {
	if ($this->request->is('get')) {
		throw new MethodNotAllowedException();
	}
	//論理削除はfalseを返す
	if (!$this->Post->delete($id, true)) {
		$sql = 'UPDATE table SET deleted = 1, deleted_date = NOW() WHERE post_id = ' . $id;
		$this->UserPost->query($sql);
		$this->autoRender = false;
		$this->Session->setFlash( $id . ' を削除しました。');
		$this->redirect(array('action' => 'index'));
	}
}

もっとスマートに行きたいですが、

とりあえずsqlで直接論理削除させてみました。

まあ、削除というよりも保存ですね。

これ作りながら

じゃあ、ビヘイビアなくてもいいじゃね~って思いましたが

それは、それで・・・。

ちなみに、物理削除でアソシエーションモデルまで削除する場合は

モデル側にdependentを記述します。

var $hasMany = array(
 'UserPost' => array(
  'dependent' => true,
 );
);

そして、deleteメソッドの第2引数にtrueを付けます。

$this->Post->delete($id, true)

しかし、ビヘイビアではこれは効きません。

上のコードは一応つけてますけど・・・

(参考)
CakePHP]deleteAll()やdelete()の$cascadeはmodel側の設定も必要

スポンサードリンク