【发布时间】:2014-07-18 14:34:36
【问题描述】:
嗯,
我创建了一个具有以下限制的模型
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 的默认行为吗?)我没想到的其他解决方案(?)。那么请给我看
谢谢
【问题讨论】:
-
很难理解您的要求,您可能需要改写您的问题,以便语法更有意义。如果您提供一些代码示例,它可能也会有所帮助。
-
@ndm ,我更新了,抱歉你可能是对的
-
你需要代码做什么?您只想保存通过验证的条目吗?还是要保存通过验证的条目和已存在的条目以进行编辑?
-
理想情况下我只想保存新的。
-
一种方法是遍历
$this->Game->invalidFields()、unset无效记录并再次调用saveAll()。
标签: cakephp