web-dev-qa-db-ja.com

symfony Doctrine特定のエンティティのレコード削除を防ぐ

doctrineエンティティがあり、データベースにこのエンティティのいくつかのレコードを削除したくないが、それらを表示したい場合があります。

一般に、デフォルトレコードがあるエンティティを含めることができます。デフォルトレコードはそこにとどまる必要があります。削除してはいけませんが、表示する必要があります。

または、たとえば、CRON操作専用の特別なユーザーアカウントを設定します。このアカウントをユーザーのリストに表示したいのですが、削除しないでください-もちろんです。

私が探していたのはSoftDeletableでした https://github.com/Atlantic18/DoctrineExtensions/blob/v2.4.x/doc/softdeleteable.md DBからのfyzical/real削除を防ぎますだけでなく、アプリの前面に表示されなくなります。それは良いアプローチです-エンティティのそれぞれのテーブル列に列を作成します-1/0フラグ-削除できないものをマークします。複数のエンティティで特性として使用できるので、この方法も気に入っています。これは、上記のAtlantic18/DoctrineExtensions拡張機能の別の拡張機能の良い候補になると思います。これが良いアイデアだと思う場合(Doctrineフィルター)、それを行うための最良のステップは何ですか?

問題は、これが唯一の方法ですか?より良い解決策はありますか?これを解決する一般的な方法は何ですか?

EDIT:1.したがって、データベースに追加の列が必要であることを知っています-再利用可能にするための特性を作成するのは簡単ですが、 2.各リポジトリに追加のコードを含めないようにするには、Annotationを使用して「列がtruの場合、削除を防止する」というロジックを実行する方法を教えてください。上記のSoftDeletableの例のように。

前もって感謝します。

7
Mirgen

これを実現する最善の方法は、データベースに列を1つ追加することです。たとえば、boolean canBeDeletedとし、レコードを削除してはならない場合はtrueに設定します。次に、リポジトリのdeleteメソッドで、削除に渡されたレコードが削除可能かどうかを確認し、例外をスローするか、別の方法で状況を処理できます。このフィールドをトレイトに追加し、1行だけで任意のエンティティに追加できます。ソフト削除とは、レコードに削除済みのマークを付けたいが、データベースには残したい場合です。

0
snaksa