【问题标题】:CakePHP saveAll repeated and non-repeated entriesCakePHP 保存所有重复和不重复的条目
【发布时间】: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


【解决方案1】:

嗯,这是我能想到的最好的方法:

$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));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-16
    • 2015-01-09
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    相关资源
    最近更新 更多