2015-06-24 64 views
3

我正在使用patchEntity()來更新hasMany關聯,並且工作正常。我的問題與保存在數據庫中的數據無關。我的問題是存儲在實體變量中的關聯數據不同步...CakePHP v3:如何獲取patchEntity以更新請求數據中的關聯

請注意,在下面的方法中,我必須在保存之後執行第二個get()以重新讀取數據庫中的數據。如果我刪除它,下一個視圖將顯示過時的關聯數據,因爲patchEntity會更新外鍵,但實際的關聯對象仍然是之前(從保存之前)。

我希望有一種方法可以不連續做兩個數據庫查詢。這是預期的行爲嗎?有沒有更好的方法來做到這一點?

public function edit($id = null) 
{ 
    //1////////////////////////////////////////// 
    $screen = $this->Screens->get($id, [ 
     'contain' => ['Blocks'=>['Datasources'=>['Agencies']]] 
    ]); 

    if ($this->request->is(['patch', 'post', 'put'])) { 

     $screen = $this->Screens->patchEntity( $screen, 
               $this->request->data, 
               [ 
                'associated'=>['Blocks.Datasources'] 
               ] 
              ); 
     if ($this->Screens->save($screen)) { 

      //2////////////////////////////////////////// 
      #get the UPDATED properties... specifically, the associations don't get updated automatically by patchEntity above 
      $screen = $this->Screens->get($id, [ 
       'contain' => ['Blocks'=>['Datasources'=>['Agencies']]] 
      ]); 

      $this->Flash->success('The screen has been saved.'); 
     } else { 
      $this->Flash->error('The screen could not be saved. Please, try again.'); 
     } 
    } 

    $this->set(compact('screen')); 
} 
+0

這與[此問題]不完全相同(http://stackoverflow.com/questions/31006015/reset-an-entity-or-create-a-new-empty-entity-in-controller-after - 節省),但答案是一樣的。成功保存後,您應該重定向,通常是查看或索引頁面。 –

+0

@GregSchmidt我明白爲什麼會這樣,但解決方案比我已經做的更加昂貴。對於任何好奇的人來說,這個鏈接的答案是在保存之後做一個重定向...這將重置/重做所有的 – emersonthis

+0

除此之外,我還沒有根據你的描述得到圖片(數據到底是什麼,修補過,並且保存的實體看起來像?),另一個數據庫又是如何讀取的,甚至是重定向「昂貴」?這不像你的行動正在被每秒1000個請求敲響,還是它? – ndm

回答

1

當然,沒有辦法避免第二個查詢。即使框架實現了該功能,也需要使用另一個查詢來查找與最新數據的關聯。

所以雖然看起來很浪費,但它是唯一的方法。

+0

謝謝何塞。有關是否用第二個查詢重置變量(如我所做的)或做重定向的建議? Greg的評論中的解決方案說你應該總是在這樣的情況下重定向... – emersonthis

+0

重定向有一個好處,那就是如果用戶嘗試點擊後退按鈕,你將避免惱人的瀏覽器行爲。您還將在您的cotroller中保存一些代碼:P –

相關問題