Propel は、オブジェクトがいつソフト削除されたかを認識しているので、子エンティティには削除された親が引き続き表示されるのでしょうか?

StackOverflow https://stackoverflow.com/questions/2519297

  •  22-09-2019
  •  | 
  •  

質問

MySQL データベース内のオブジェクトをソフト削除し、Propel ORM を使用しています。ソフト削除は機能するようになりましたが、実際の行は削除されないため、強制された親子関係が失われます。

Null 参照例外がスローされないように、アクセス時にレコードが論理的に削除されたことを Propel が知る方法はありますか?こうすることで、親が削除されても、その子は引き続き使用できます。 読む それは関係性ですが、いつ 更新中 子供、または 作成 新しい子、削除された親にはアクセスできません。

例えば、

Book には AuthorId があり、AuthorId に属する著者が論理的に削除された場合、次のようになります。

$book->getAuthor();

正しい作成者が返されます (閲覧のみを目的としています)。ただし、新しい書籍が追加された場合、ソフト削除された著者は選択できません。

その機能が Propel に組み込まれているかどうか知っている人はいますか?

役に立ちましたか?

解決

論理的な削除は壊れた抽象化です。代わりに、アーカイブ可能な動作を使用する必要があります (理由については、Propel ブログを参照してください: http://propelorm.org/blog/2011/08/29/introducing-archible-behavior-and-why-soft-delete-is-deprecated.html)

他のヒント

私は確信し、なぜ著者は、削除することが許されるないんだが、彼の作品ではないだろう(あるいは、基本的には、なぜこのプロジェクトでシナリオとして起動します)がありますが、カスタム条件を作成し、それを実行することができます。次のコードは、使用しているのPropelのバージョンに依存します(しかし、コンセプトは同じまま):

$c = new Criteria();
$c->getNewCriterion(self::AUTHOR_ID, $parentId);
return self::doSelect($c, $connection);

ただ、この質問に出くわし。それはあなたが記述されている機能のためのソフトの削除を使用しないように多くの理にかなってのように思えます。私は非常にあなたは著者が有効になっているかどうかのフラグ、ISENABLED呼ばすなわちブールフィールドにフィールドを作成することをお勧めします。

あなたは、この場合には、AuthorQueryクラス用に生成されたフィルタ方式を使用することができます。

AuthorQuery::create->filterByisEnabled()
                   ->find();

オブジェクトがまだアプリケーションで使用されようとしている場合、本当に削除することは適切ではありません。ソフト削除機能は、参照または復帰ミスのためにだけは本当にです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top