如何在实体上级联用户定义的操作?

时间:2013-03-21 22:42:25

标签: doctrine-orm

我正在尝试找出一种在与实体关联的所有实体上级联操作的方法。例如,如果我有一个用户,并且用户有实体,并且这些实体有实体,我想对每个实体执行操作。具体来说,我想对该树中的每个实体进行验证。

我如何实现'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);
}

我意识到我可以使用生命周期回调来执行验证。但是,设置验证注释会使事情变得更容易。我可以验证我坚持的每个实体,但我无法验证其相关实体。

1 个答案:

答案 0 :(得分:1)

  

我可以验证我坚持的每个实体,但我无法验证它   相关实体。

当然,如果符合以下条件,您可以执行与主要实体相关的任何操作:

  1. 您将cascade={"all"}添加到@ManyToOne定义(必需!)。
  2. @HasLifecycleCallbacks表示您希望执行操作的每个子实体,并标记方法@PrePersist@PostPersist or more in documentation
  3. 例如,我使用此方法级联删除Image实体中的图像文件,而包含Image实体的任何实体都被删除了:

    此处我有一个生命周期回调

    /**
     * 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;
    
    }