2014-07-18 57 views
0

好,CakePHP的白水重複和不重複的條目

我創建了以下限制

public $validate = array(
     'player_id' => array(
      'rule' => array(
       'checkUnique', 
       array(
        'player_id', 
        'game_id' 
       ), 
       true 
      ), 
      'required'  => true, 
      'allowEmpty' => false, 
      'on'   => 'create', 
      'message'  => 'Same player_id y game_id' 
     ) 
    ); 

所以每次我試圖在表中創建一個遊戲記錄被創建只有一個型號它尚未創建。

所以我在一個控制器中創建了一個動作,它可以獲取最近的一個玩家的遊戲並使用saveAll保存到數據庫中。

如果數據庫爲空,當然沒有任何問題。但是,如果我收到一些遊戲,並且其中一些遊戲已經被插入以前saveAll失敗,因爲一些遊戲已經進入數據庫。

public function getRecentGames($server = null, $player = null){ 
    $this->autoRender = false; 

    if(!empty($server) && !empty($player)){ 
     $r = $this->_getRecentGames($server, $player, $gamesData); 
     if ($r['code'] == 200) { 
      if ($this->Game->saveAll($gamesData, array('deep' => true))) { 
       pr($gamesData); 
       prd('Saved'); 
      } else { 
       pr($this->Game->invalidFields()); 
       prd('Not saved'); 
      } 
     } else { 

     } 
    } 
    return print_r($gamesData, true); 
} 

基本上saveAll(..)內部調用validateMany(..)因爲不是每個項有效白水不嘗試保存其返回false。這是CakePHP的正常行爲以及開發人員希望它工作的方式。

那麼,我該怎麼辦?

  • 檢查每個遊戲並嘗試保存它? foreach ($games as $game) { $this->Model->saveAssociated(..); }

  • 修改saveAll(..)的行爲以保存有效的遊戲而不是無效的遊戲。 (你認爲這應該是CakePHP的默認行爲嗎?)

  • 其他解決方案我沒想到(?)。請告訴我,然後

謝謝

+0

很難明白你問什麼,你可能要改口這個問題讓語法變得更有意義。如果你提供一些代碼示例,它可能也會有所幫助。 – ndm

+0

@ndm,我更新了,對不起,你可能是對的 – Tzaoh

+0

你需要做什麼代碼?你想只保存通過驗證的條目嗎?還是你想保存通過驗證的條目和已經存在的條目進行編輯? – vicocamacho

回答

0

嗯,這是我能想到的最好的辦法:

$validations = $this->Game->validateMany($gamesData, array('deep' => true, 'atomic' => false)); 
for ($i=count($gamesData)-1; $i>=0; $i--) { 
    if (!$validations[$i]) { 
     unset($gamesData[$i]); 
    } 
} 
if (!empty($gamesData)) { 
    $result = $this->Game->saveAll($gamesData, array('deep' => true, 'validate' => false)); 
}