2013-03-20 60 views
1

我已經搜索過,並且存在很多與同樣問題的問題,但是他們都沒有解決我的問題。學說PreUpdate從來沒有工作過

我有一個實體,這裏是它的代碼:

/* 
* @ORM\HasLifecycleCallbacks 
*/ 
class MyEntity 
{ 
    // some preoperties here... 

    /** 
    * @ORM\Column(type="text", nullable=true) 
    * @Assert\MaxLength(limit="500") 
    */ 
    private $delivery = null; 

    /** 
    * @var $deliveryOn bool 
    * 
    * Virtual field used for $delivery property organization 
    */ 
    private $deliveryOn = false; 

    /** 
    * @ORM\PrePersist() 
    * @ORM\PreUpdate() 
    */ 
    public function preSetDelivery() 
    { 
     if ($this->deliveryOn == false) 
      $this->delivery = null; 
    } 

    /** 
    * @ORM\PostLoad() 
    */ 
    public function loadDeliveryOn() 
    { 
     if ($this->delivery != null) 
      $this->deliveryOn = true; 
    } 
} 

loadDeliveryOn方法完全適用所有的時間。但是當我第一次堅持實體到數據庫時,preSetDelivery只激發了。我希望在更新對象時調用它,但它不起作用。我不知道爲什麼。

我的編輯器:

public function editAction($id) 
{ 
    // some code here... 
    // ... 

     $request = $this->getRequest(); 
     if ($request->isMethod('POST')) 
     { 
      $form->bind($request); 

      if ($form->isValid()) 
      { 
       $em->flush(); 
      } 
     } 
} 
+0

「我希望在更新對象時調用它」您是在談論php對象還是正在更新的數據庫中的行? – mpm 2013-03-20 23:36:57

+0

如果您移除PrePersist,會發生什麼情況?更新是否獨立運行? – Mark 2013-03-21 12:52:16

+0

@Mark沒有任何變化 – Hast 2013-03-21 15:56:32

回答

0

來自官方的docs關於preUpdate

變化所傳遞的實體不會被 刷新操作公認了的領域,使用計算改變集傳遞給 事件以修改原始字段值。

如果你有機會獲得UnitOfWork也許有一種方法重新計算改變設定,因爲在onFlush

+0

好的。我想要做的就是改變一個領域的實體取決於另一個領域。由於我有很多使用這個實體的表單,我想要一個基於實體的解決方案。那麼我現在該做什麼? – Hast 2013-04-01 18:58:24

0

如果你使用繼承 - 例如@ORM \ InheritanceType(「SINGLE_TABLE」) 你需要添加@ORM \ MappedSuperclass在父類

+0

不,我不... – Hast 2013-03-21 15:58:07

-1

更新前只有火災,如果有實體上的實際變化。如果您不更改表單中的任何內容,則實體將不會發生任何更改,並且不會調用preUpdate偵聽器。

+0

我**做**改變它。 – Hast 2013-04-20 15:27:37