データを削除する

CakePHP の Model クラスではデータベースからレコードを削除するいくつかの方法が提供されています。

delete

delete(integer $id = null, boolean $cascade = true);

$id で特定されるレコードを削除します。 デフォルトでは、削除される該当レコードに依存しているレコードも削除されます。

例えば複数の Recipe レコードとひも付いた User レコード (User 『hasMany』 または 『hasAndBelongsToMany』 Recipes) を削除する場合

  • $cascade が true の場合、モデルの dependent の値が true になっていれば関連する Recipe レコードも削除されます。
  • $cascade が false の場合、User が削除されても Recipe レコードは残ります。

データベースが外部キーとカスケードデリートをサポートしているなら、 多くの場合は CakePHP のカスケーディングよりその機能を利用した方が効率的です。 Model::delete() のカスケード機能を使うメリットのひとつは、 ビヘイビアやモデルのコールバックを利用できることです。

$this->Comment->delete($this->request->data('Comment.id'));

モデルとビヘイビアが持つ beforeDeleteafterDelete コールバックを利用して、削除のプロセスに独自のロジックをフックすることができます。 詳しくは コールバックメソッド をご覧ください。

注釈

もし、依存するレコードを持ち、それらの1つが削除のコールバック (例えば beforeDelete など) が false を返した場合でも、イベントの伝播は停止せず、最初の delete の 戻り値は変わりません。

deleteAll

deleteAll(mixed $conditions, $cascade = true, $callbacks = false)

deleteAll()delete() と似ていますが、 異なる点は deleteAll() が与えられた条件にマッチするレコードを全て削除する $conditions 配列は SQL の断片または配列で与えます。

  • conditions マッチさせる条件
  • cascade 真偽値、true に設定するとそのレコードに依存するレコードも削除する
  • callbacks 真偽値、コールバックを走らせる

戻り値は真偽値で、成功したら true を、失敗したら false を返します。

例:

// find() と同様に、配列で与えられた条件で削除する
$this->Comment->deleteAll(array('Comment.spam' => true), false);

コールバックまたはカスケード、あるいはその両方で削除を行った場合、対象となる行が検索されてから 削除が行われます。この場合はより多くのクエリが発行されることになります。 deleteAll() で条件にマッチするレコードを削除する前にアソシエーションはリセットされます。 アソシエーションを変更するために bindModel() や unbindModel() を使用する場合、 reset パラメータを false に設定すべきです。

注釈

deleteAll() は削除されるレコードがなかった場合 true を返します。 削除対象の条件は正しく、また対象のレコードは残っていないからです。