我正在尝试找出一种在与实体关联的所有实体上级联操作的方法。例如,如果我有一个用户,并且用户有实体,并且这些实体有实体,我想对每个实体执行操作。具体来说,我想对该树中的每个实体进行验证。
我如何实现'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);
}
我意识到我可以使用生命周期回调来执行验证。但是,设置验证注释会使事情变得更容易。我可以验证我坚持的每个实体,但我无法验证其相关实体。
答案 0 :(得分:1)
我可以验证我坚持的每个实体,但我无法验证它 相关实体。
当然,如果符合以下条件,您可以执行与主要实体相关的任何操作:
cascade={"all"}
添加到@ManyToOne
定义(必需!)。@HasLifecycleCallbacks
表示您希望执行操作的每个子实体,并标记方法@PrePersist
或@PostPersist
or more in documentation。例如,我使用此方法级联删除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;
}