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 回答