1

エンティティに関連付けられたすべてのエンティティに対して操作をカスケードする方法を見つけようとしています。たとえば、ユーザーがいて、ユーザーにエンティティがあり、それらのエンティティにエンティティがある場合、すべてのエンティティに対して操作を実行したいと考えています。具体的には、そのツリー内のすべてのエンティティに対して検証を実行したいと考えています。

「getAssociatedEntities()」のようなものをどのように実装しますか?

class User {
    /**
     * @ManyToOne(targetEntity="Comment")
     */
    private $comment;
    /**
     * @ManyToOne(targetEntity="Something")
     */
    private $something;
}

$user->setComment($comment);
$user->setSomething($something);
$associated_entities = $user->getAssociatedEntities(); // NOT A REAL METHOD

foreach ($associated_entities AS $entity) {
    validate($entity);
}

ライフサイクル コールバックを使用して検証を実行できることに気付きました。ただし、検証アノテーションを設定すると、物事が非常に簡単になります。保持するすべてのエンティティを検証できますが、関連するエンティティを検証することはできません。

4

1 に答える 1

1

保持するすべてのエンティティを検証できますが、関連付けられているエンティティを検証することはできません。

もちろん、次の場合、メイン エンティティに関連付けられたエンティティに対して任意のアクションを実行できます。

  1. 定義に追加cascade={"all"}@ManyToOneます (必須! )。
  2. @HasLifecycleCallbacksアクションを実行するサブエンティティごとに、ドキュメントでメソッド@PrePersistまたは@PostPersist それ以上をマークします。

たとえば、Imageエンティティを含むImageエンティティが削除されている間に、このメソッドを使用してエンティティ内の画像ファイルの削除をカスケードします。

ここに livecycle コールバックがあります:

/**
 * An image.
 * 
 * @ORM\Entity
 * @ORM\Table(name="images")
 * @ORM\HasLifecycleCallbacks
 */
class ImageEntity extends AbstractEntity
{
    /**
     * @ORM\PreRemove
     */
    public function preRemoveDeleteFile()
    {
        // remoce file
    }
}

ここに Image を含むエンティティがあります (カスケード操作が定義されている場所):

/**
 * A competency group name.
 * 
 * @ORM\Entity
 * @ORM\Table(name="product_meta_image_cover")
 */
class ProductMetaImageCoverEntity extends AbstractEntity
{
    /**
     * @var \ModuleModel\Entity\ImageEntity
     * @ORM\OneToOne(targetEntity="ModuleModel\Entity\ImageEntity", cascade={"all"}, orphanRemoval=true)
     * @ORM\JoinColumn(onDelete="CASCADE")
     */
    protected $image;

}
于 2013-03-23T15:54:22.530 に答える