From the daily archives: 水曜日, 8月 24, 2011

データを削除しないで削除フラグだけたてておきたいときがよくあります。
webアプリを作る場合はコメントなどはこの機能が必須になります。つけとかないとあとでユーザー間のもめごとが起きたときに困ってしまいます。

Symfony&Doctrineならばこの論理削除が簡単にできます。

■準備

  1. Schema.ymlでactAsにSoftDeleteを追加する
    [plain]Comment:
    actAs: { SoftDelete: ~ }
    columns:
    comment_id: { type: integer, primary: true, autoincrement: true}
    user_id: { type: integer, notnull: true}
    comment: { type: string, notnull: false}
    [/plain]
  2. migrateとかbuild:modelとかをして、DBに変更を適用させる
  3. ProjectConfigration.class.phpでconfigureDoctrine関数を追加し、起動時にDoctrineのSoftDeleteの機能が有効になるように設定する
    [php] public function configureDoctrine(Doctrine_Manager $manager)
    {
    $manager->setAttribute(Doctrine_Core::ATTR_USE_DQL_CALLBACKS, true);
    }[/php]


■つかいかた
この機能を追加する前と何も変わらずに使えます
例)削除済みでないコメントで、特定のユーザーのものを取得する
[php] $data = CommentTable::getInstance()
->createQuery(‘c’)
->where(‘c.user_id = ‘. $userId)
->execute();
[/php]



■削除済みのデータもとりたいとき
削除済みのデータを取りたいときはwhereでdeleted_atのところに条件を追加するようにしてあげます。
例)削除済みのコメントで、特定のユーザーのものを取得する
[php] $data = CommentTable::getInstance()
->createQuery(‘c’)
->where(‘c.user_id = ‘. $userId)
->addWhere(‘c.deleted_at is not null’)
->execute();
[/php]

削除済みのも削除してないのもとりたいときは、ちょっとスマートじゃないですがwhereで両方指定してあげます
例)削除済みのも含め、すべてのコメントで特定のユーザーのものを取得する
[php] $data = CommentTable::getInstance()
->createQuery(‘c’)
->where(‘c.user_id = ‘. $userId)
->addWhere(‘c.deleted_at is null or c.deleted_at is not null’)
->execute();
[/php]