2013-03-21 28 views
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); 
} 

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

回答

1

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

  1. 你加cascade={"all"}@ManyToOne定义:

当然,你可以执行任何动作与主要实体,如果entitied相关联(需要!)。

  • @HasLifecycleCallbacks对于您要执行操作的每个子实体,并标记方法@PrePersist@PostPersistor more in documentation
  • 例如我用这个方法级联在Image实体图像文件的删除,而包含Image实体的任何实体是beeing删除:

    这里我有一个的LiveCycle回调

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

    在这里,我有一个包含图像的实体(那里有一个级联操作定义):

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

    谢谢您的回复。不幸的是,你没有回答这个问题。我得出的结论是,没有办法在实体上级联操作。可以做的最好的就是使用生命周期回调,我已经在这个问题中解决了这个问题。回调的问题是它们只发生在持久,加载和移除等操作过程中。如果你想在其他时间做一个动作,那么你的运气不好。不过,我现在认为这很好。如果你不能用生命周期回调来做,你可能不应该这样做:) – 2013-03-25 16:45:30

    相关问题