My favorites | Sign in
Project Home Downloads Wiki Issues Source
Search
for
sfPropelParanoidBehaviorPlugin  
Propel論理削除用プラグイン
PlugIns
Updated Feb 4, 2010 by masakielastic

このドキュメントは http://trac.symfony-project.com/wiki/sfPropelParanoidBehaviorPlugin (03/27/08 03:02:43)の翻訳です。

sfPropelParanoidBehaviorPlugin plugin

sfPropelParanoidBehaviorPlugin は、新しいPropel ビヘイビアを提供するsymfonyプラグインです。

もし、このビヘイビアをモデルクラスのうちの一つの為に有効にすると、このクラスのいかなるオブジェクトの削除も無効となり、 代わりにオブジェクトのdeleted_atカラムの更新に置き換えられます。

プラグインはオブジェクトを強制削除するための、新しいforceDeleteメソッドも追加します。

インストレーション

  • プラグインのインストール

      symfony plugin-install http://plugins.symfony-project.com/sfPropelParanoidBehaviorPlugin
  • propel.iniにて、Propel ビヘイビアサポートを有効にしてください:
      propel.builder.AddBehaviors = true

もしビヘイビアサポートを有効にしなければならないのであれば、モデルをリビルドしてください:

      symfony propel-build-model
  • Propel モデルのうちの一つで、ビヘイビアをアクティブにします:
      // lib/model/Article.php
      class Article
      {
      }

      sfPropelBehavior::add('Article', array('paranoid'));
デフォルトでは、プラグインはこのモデルのdeleted_atカラムを更新します。他のカラムを指定することもできます。
      sfPropelBehavior::add('Article', array('paranoid' => array('column' => 'deleted_at')));

使い方の例

下記のコードはいくつかのPropelの呼び出し方法と生成されるSQLのサンプルです:

  $article = Article::retrieveByPK(1);

  // SELECT blog_article.ID, blog_article.AUTHOR_ID, blog_article.CREATED_AT, blog_article.DELETED_AT FROM blog_article
  // WHERE blog_article.ID=1 AND blog_article.DELETED_AT IS NULL

  $article->delete();

  // UPDATE blog_article SET DELETED_AT = '2006-10-21 10:58:56' WHERE blog_article.ID=1

  $article->forceDelete();

  // DELETE FROM blog_article WHERE blog_article.ID=1

  $articles = ArticlePeer::doCount(new Criteria());

  // SELECT COUNT(blog_article.ID) FROM blog_article WHERE blog_article.DELETED_AT IS NULL

このように、ビヘイビアを無効にすることもできます:

  sfPropelParanoidBehavior::disable();

パラノイドビヘイビアは、すぐ次のリクエストに対して、無効になります。

  $article->delete();
 
  // UPDATE blog_article SET DELETED_AT = '2006-10-21 10:58:56' WHERE blog_article.ID=1

  sfPropelParanoidBehavior::disable();
  $article->delete();

  // DELETE FROM blog_article WHERE blog_article.ID=1

  $article->delete();
 
  // UPDATE blog_article SET DELETED_AT = '2006-10-21 10:58:56' WHERE blog_article.ID=1

追加のインストールノート

1) もしtrunkを使っていないのであれば(例えば、もし1.0.xのバグフィックスリリースを使っているのであれば)このファイルをダウンロードして、symfonyライブラリーを置き換えてください: http://trac.symfony-project.com/browser/trunk/lib/plugins/sfPropelPlugin/lib/propel/builder/SfPeerBuilder.php もし、これをしないと、ビヘイビアは正しく'deleted_at'の値を設定しても、削除済として印付けられたレコードを除外するための抽出結果のフィルタリングが失敗します。

2) プラグインはスキーマを修正しないので、このビヘイビアを有効にしたいそれぞれのテーブルに対して、'deleted_at'フィールドを追加する必要があります。

deleted_at:     timestamp

3) ticket:1229 の通り、(README のアドバイスのに従って)sfPropelBehavior::add()をクラス定義の後に記述すると、動作しません。これらを、app/config/config.php に記述すれば動作します。

/app/config/config.php
    ...
    sfPropelBehavior::add('Address', array('paranoid'));
    ...

この設定は、symfony 1.0.4 でテストされました。

2008/03/27 時点で: symfony 1.0.11 でテスト: 1. /app/config/config.php は編集しないでください。代わりに、ここから最新のファイルをインストールしてください http://trac.symfony-project.com/browser/trunk/lib/plugins/sfPropelPlugin/lib/propel/builder/SfPeerBuilder.php

上で論じられているように、それから symfony propel-build-model でモデルをリビルドしてください。この作業によって論理削除するエントリを除外するために結果がフィルタリングされることが保証されます。

未処理のバグ: フォームバリデータのsfPropelUniqueValidatorと一緒には動作しません。このバリデータのバリデーションSQLは、WHERE DELETED_AT IS NULLを指定しないので、もしレコードが論理削除されていてもそのレコードは依然として見つかります。

添付ファイル

Wiki参照


Sign in to add a comment
Powered by Google Project Hosting