2014-05-12 16 views
5

Próbuję zaimplementować funkcję, która pozwala użytkownikowi określić jego wzajemny status i wybrać innego użytkownika, tak jak ten na Facebooku.Doctrine - Zdobądź starą wartość w detektorze zdarzeń onFlush

moim schemacie bazy danych jak:

UserInfo podmiot:

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 podmiot:

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"; 
    } 
} 

Oto odbiornik zdarzeń, który sprawdza status użytkownika i zmienia drugiego użytkownika, działa zgodnie z oczekiwaniami. Ale ma tylko jedną wadę, jeśli użytkownik jest żonaty (A), a następnie zamienił go na żonaty z (B), użytkownik (A) wciąż otrzymuje żonę i nie zostaje zresetowany.

Wszystko, co chcę zrobić, to przed podłączeniem relacji użytkownika do (B), chcę odzyskać (A) i zresetować. Jak to zrobić w przypadku zdarzenia onFlush.

Odpowiedz

13

Doctrine UoW posiada metodę propertyChanged (...), która śledzi zmiany właściwości obiektu. Zmiany te są przechowywane w jednostce entityZmień ustawienia-Właściwość UU.

Myślę, że powinno być możliwe wywołanie $uow->getEntityChangeSet($entity), która zwraca tablicę, w której klucze są wartościami właściwości $ encji, a wartościami są [$oldValue, $newValue].

Nie jestem pewien, czy musisz zadzwonić pod numer computeChangeSet() dla starego użytkownika relacji, ale mam nadzieję, że możesz to zrozumieć i zostawić komentarz?

+1

Dzięki za milion! Działa z '$ uow-> getEntityChangeSet ($ entity)'. Zwrócił tablicę asocjacyjną ze wszystkimi zmienionymi polami. I bez potrzeby wywoływania 'computeChangeSet()'. Dzięki jeszcze raz. –

+1

Świetnie! Dziękuję za aktualizację! – SecretUsername

Powiązane problemy