2016-01-08 86 views
0

我有一個實體Key(不是真正的名字,就知道密鑰是禁止的),我需要在一個循環中,得到Keystate=1,並將其更改爲state=2。這是我的腳本:Symfony的原則排除堅持實體

 /* Each object */ 
     for ($i=0; $i < $order->getQuantity(); $i++) { 

      /* get available key */ 
      $key = $this->getDoctrine()->getRepository('AppBundle:Key')->findOneBy(array('state' => 1)); 

       $key->setState(2); // On la rend active 
       $this->_em()->persist($key); 
      } 
     } 

我probleme是這一行:$key = $this->getDoctrine()->getRepository('AppBundle:Key')->findOneBy(array('state' => 1));

主義總是與state=1相同的第一個關鍵。如果我直接在循環中刷新,那沒問題,但是我可以有一個非常大的循環,而且我不想刷新XXXX次。

有沒有辦法不獲得持久的實體?如果我還沒有堅持下去,我該如何對學說說state=1ONLY

謝謝!

+0

也許我錯過了你的例子中的一些上下文,但你爲什麼在一個循環中一個接一個地獲取記錄,而不是用' - > findBy(['state'=> 1])''返回全部?事實上,如果你只是想更新一堆記錄,你可以創建一個DQL/SQL更新查詢,也可以將其放入一個自定義的'KeyRepository'中。 –

回答

3

你爲什麼不這樣做:

$keys = $this->getDoctrine()->getRepository('AppBundle:Key')->findBy(array('state' => 1)); 
foreach($keys as $key) { 
    $key->setState(2); 
    $this->_em()->persist($key); 
} 
$this->_em()->flush(); 

因此每個鍵只會堅持一次,因爲堅持的東西是symfony的邏輯只有你有沖洗功能中只有一個數據庫寫操作,所有堅持項目將被存儲

0

除了檢索和循環你的實體,你也可以使用DQL(除非我從你的問題中排除了這個問題的上下文)。

例如:

$dql = 'UPDATE AppBundle:Key k SET k.state = 2 WHERE k.state = 1'; 
$query = $this->_em->createQuery($dql); 
$result = $query->getResult(); 

這是未經測試明顯。自從我編寫DQL以來已經有一段時間了,所以您可能需要查閱文檔。希望這有助於:)

0

堅持意味着「嘿學說,讓我們知道該實體實例!」。

它的使用(如你一定已經知道)當你創建一個新的實體實例($key = new Key();),然後你想學說是意識到這一點($em->persist($key);),以便能夠在數據庫上刷新添加新記錄($em->flush())。

所有使用Doctrine檢索的實體實例都已經存在(Doctrine已經知道它們)。

因此,在您的代碼中,persist調用是無用的。而當你不刷新時,數據庫不會更新。
然後,在接下來的循環,當你從數據庫(->findOneBy(...))要求,你將再次得到相同的實體實例,與state仍然等於1

最後,要回答你的問題「有什麼辦法?做不了已經堅持實體怎樣才能教義告訴他要Key with state=1ONLY如果我不堅持已經「:

不,它只是不可能的。