2013-10-23 5 views
7

私はSymfony2プロジェクトを構築していて、ソフト削除を実装するのにgedmo/doctrine-extensionsGitHub)を使用しています。私の質問は、ソフト削除を「無効にする」か「上書きする」か、何かがソフト削除されたかどうかを検出する方法があるかどうかです。Symfony2/Doctrine:Gedmoの教義拡張子を使用しているときに "deleted"データを読む

私は、「ユーザー」のエンティティを参照する「ノート」の実体を持っている:

はここの状況です。特定のメモは、ソフト削除されたユーザーを参照します。ユーザーは削除されていますが、TWIGの "定義された"ロジックに対してはtrueを返し、削除されたユーザーのIDも返すことができます。しかし、他の情報(削除されているかどうかを示す "deletedAt"パラメータを含む)を問い合わせると、500個のエンティティが見つかりませんでした "というエラーが表示されます。

データは実際にはまだ存在しているので、ノート自体は削除されていないので、ユーザーが削除されたにもかかわらず、誰がそのメモを書き留めているかを伝えたいと思います。

これは可能ですか?そうでない場合は、何かがソフト削除されたかどうかを正しく検出するにはどうすればよいですか?私が言ったように、$note->getUser()はまだオブジェクトを取得し、null/"定義された"比較に対して真を返します。

+0

これはDoctrine2の既知の制限です、見https://github.com/doctrine/doctrine2/issues/4543 – PowerKiKi

答えて

6

あなたは熱心ロードに関する詳細な情報を見つけることができますし、それはここに注釈です:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#by-eager-loading

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html。私のコードについては

、これは今Userへのリンクを定義するときに、それがどのように見えるかです:この場合

/** 
* @ORM\ManyToOne(targetEntity="User", inversedBy="answers", fetch="EAGER") 
* @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
*/ 
private $user; 

Userエンティティが複数のanswersを持つことができます。 answer視点からUserをロードするとき、これは動作します:

foreach($answers as $answer) { 
    $user = $answer->getUser(); 

    if (!$user) { 
     continue; 
    } 
} 
+0

'eager loading'のドキュメントへのリンクが動作しません –

+0

ありがとう、それを修正:) – Oli

1

削除されたアイテムが結果に返されるように一時的にソフト削除を無効にすることができます。あなたのために特に興味深いSee the documentationは、読み込みセクションです:、

これはSoftDeleteableフィルタを無効になりますので、 「ソフト削除」結果に表示されます $ EM-> getFilters()したエンティティ - >無効( 'ソフト削除可能')。だから、

、最初のエンティティ・マネージャ$emに上記のコードを実行して、あなたの$noteを収集するためにそれを使用。

+0

問題は、Iドンでありますソフト削除された親エンティティ(つまり、ノート)が必要です。フィルタを無効にすると、削除したいノートも返されます。 –

14

あなたはこれを行うことができます:あなたは、これは単なるid何もないと、オブジェクトの遅延ロードを防ぐことができます、eagerに関係負荷を設定する必要が

$filter = $em->getFilters()->enable('soft-deleteable'); 
$filter->disableForEntity('Entity\User'); 
$filter->enableForEntity('Entity\Note'); 
+3

**ソフト削除可能な**の代わりに** 'softdeleteable' **することができます...(私はstokの教義拡張を使用しています) – eDoV

関連する問題