2014-05-12 4 views
5

사용자가 상호 상태를 지정하고 다른 사용자를 선택할 수있는 기능을 구현하려고합니다. 마치 페이스 북에서와 마찬가지입니다.Doctrine - onFlush 이벤트 리스너에서 이전 값 가져 오기

내 데이터베이스 스키마와 같은 것입니다 :

UserInfo 기업 :

class UserInfo 
{ 

    /** 
    * @ORM\OneToOne(targetEntity="User", inversedBy="user_info") 
    */ 
    protected $user; 

    /** 
    * @ORM\Column(type="text", nullable=true) 
    * @Assert\NotBlank 
    */ 
    protected $status; //Value taken from a dropdown list 

    /** 
    * @ORM\OneToOne(targetEntity="User", inversedBy="relationship_with_table") 
    */ 
    protected $relationship_user; 
} 

User 기업 :

class User 
{ 

    /** 
    * @ORM\OneToOne(targetEntity="UserInfo", mappedBy ="user", cascade={"persist","remove"}) 
    */ 
    protected $user_info; 

    /** 
    * @ORM\OneToOne(targetEntity="UserInfo", mappedBy="relationship_user") 
    */ 
    protected $relationship_with_table; 
} 

UserInfoType :

class UserInfoType extends AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $option) 
    { 
     $builder 
      ->add("birthday", "birthday") 
      ->add("gender", "choice", array("choices" => array("0" => "Male", "1" => "Female"))) 
      ->add("status", "choice", array("choices" => array(
        "Single" => "Single", 
        "In relationship" => "In relationship", 
        "Engaged" => "Engaged", 
        "Married" => "Married" 
       ))) 
      ->add("relationship_user", "thrace_select2_entity", array(
        "class" => 'Zgh\FEBundle\Entity\User', 
        'label' => 'User', 
        'empty_value' => 'Select user', 
        "configs" => array(
         "width" => '100%', 
        ), 
       )) 
      ->add("city", "text") 
      ->add("work", "text") 
      ->add("facebook", "url") 
      ->add("twitter", "url") 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
       "data_class" => 'Zgh\FEBundle\Entity\UserInfo', 
       "cascade_validation" => true, 
      )); 
    } 

    public function getName() 
    { 
     return "user_info"; 
    } 
} 

이제 이벤트 리스너가 있습니다. 사용자 상태를 확인하고 다른 사용자를 변경합니다. 예상대로 작동합니다. 그러나 사용자가 (A)와 결혼하여 (B)와 결혼 한 경우 사용자 (A)는 여전히 결혼 한 사람을 얻고 재설정하지 않습니다.

내가 원하는 것은 (B)에 사용자 관계를 연결하기 전에, (A)를 검색하고 재설정하려고합니다. onFlush 이벤트 내에서 어떻게 수행 할 수 있습니까?

답변

13

Doctrine UoW에는 엔티티 속성의 변경 사항을 추적하는 propertyChanged (...) 메소드가 있습니다. 이러한 변경 내용은 UoW의 entityChangeSets-Property에 저장됩니다.

키가 $ entity의 속성이고 값이 [$oldValue, $newValue] 인 배열을 반환하는 $uow->getEntityChangeSet($entity)을 호출 할 수 있어야한다고 생각합니다.

난 당신이 오래된 관계 사용자에 대한 computeChangeSet()를 호출 할 필요가 있는지 확실하지 않습니다,하지만 난 당신이 파악하고 덧글을 남길 수 있기를 바랍니다?

+1

감사합니다. 그것은'$ uow-> getEntityChangeSet ($ entity)'와 함께 작동했습니다. 변경된 모든 필드가있는 연관 배열을 반환했습니다. 그리고'computeChangeSet()'도 호출 할 필요가 없다. 다시 한번 감사드립니다. –

+1

좋아요! 업데이트 해주셔서 감사합니다! – SecretUsername

관련 문제