投稿に関連するログを含むテーブルがあり、投稿を削除するときにそのデータを削除したくありません。
一方、投稿のすべてのコメントとその他のデータを削除したいと考えています。
私はドキュメントを見てきましたが、彼らはそれについて何も言っていません: http://book.cakephp.org/2.0/en/models/deleting-data.html
ありがとう。
投稿に関連するログを含むテーブルがあり、投稿を削除するときにそのデータを削除したくありません。
一方、投稿のすべてのコメントとその他のデータを削除したいと考えています。
私はドキュメントを見てきましたが、彼らはそれについて何も言っていません: http://book.cakephp.org/2.0/en/models/deleting-data.html
ありがとう。
これは、少なくとも 2 つの異なる方法で行うことができます。
$this->Post->delete($id, $cascade)
On は、2 番目のパラメーターを呼び出すときに、削除操作で関連付けられたレコードも削除する必要があるかどうかを示すブール値です ( Post レコードに依存するものなど)。
$this->Post->delete($id, false);
関連するレコードは削除されません。これは$this->Model->deleteAll();にも当てはまります。これは、グローバルではなく設定したい場合です。
依存は非常に重要です。この概念はhasMany
orhasOne
リレーションの構成にも設定できるため、これがデフォルトの削除動作になります。
public $hasMany = array(
'Log' => array(
'className' => 'Log',
'foreignKey' => 'post_id',
'dependent' => false
)
);
この例では、関連する Post レコードが削除されても、Log レコードは削除されません。
使用して$this->Post->unbindModel('hasMany' => 'Log')
(または$this->unbindModel('hasMany' => 'Log'
Postモデル内で)削除を呼び出す前に、関連付けを削除してみてください。
バックエンドが MySQL の場合は、外部キー チェックを無効にし (SET FOREIGN_KEY_CHECKS=0;)、親の投稿とそのコメントを削除して、外部キー チェックを再び有効にすることができます (SET FOREIGN_KEY_CHECKS=1;)。ただし、これはお勧めしません。
投稿に「ソフト削除」を実装し(「削除済み」フィールドを指定し、削除されたときにtrueに設定するインデックスを追加します)、フロントエンドクエリを更新して、削除済み=の投稿を無視する傾向があります1
ソフト削除の動作はいくつかありますが、コードは非常に簡単に実装できます。