那么,
我创建了一个具有以下限制的模型
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,因为并非每个条目都有效且saveAll不会尝试保存。这是CakePHP的正常行为以及开发人员希望它的工作方式。
那么,我该怎么办?
检查每个游戏并尝试保存吗?
foreach ($games as $game) {
$this->Model->saveAssociated(..);
}
修改saveAll(..)
的行为以保存有效游戏,而不是无效游戏。 (你认为这应该是CakePHP的默认行为吗?)
我没有想到的其他解决方案(?)。请告诉我
谢谢
答案 0 :(得分: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));
}