【问题标题】:Magic of UpdateAllUpdateAll 的魔法
【发布时间】:2014-06-17 08:30:07
【问题描述】:

我在 cakephp 中写了下面的代码 for and updateAll query like

$this->loadModel('User');
$this->User->updateAll(array('stauts'=>'active'),array());

上面代码等效的SQL查询是这样生成的

UPDATE User SET status='active' WHERE 0 = 1;

当我像下面这样在 cakephp 中写 updateAll 时

$this->loadModel('User');
$this->User->updateAll(array('stauts'=>'active'));

这段代码等效的SQL查询是这样生成的

UPDATE User SET status='active';

我不知道为什么会这样。

如果您不理解我的问题,请在 cmets 中告诉我,我会尽快解释。

【问题讨论】:

  • 作为开发者,我们应该按照cakephp的转换,updateAll函数的第二部分包含条件,如果我们没有条件,我们不应该通过...
  • 最好问问 cakePhp 创建者,他们可能错过了考虑这种情况。
  • 如何询问 cakePhp 创作者团队?
  • @AD7six 当然不是bug。我认为它可以被视为增强。所以$this->User->updateAll(array('stauts'=>'active'),array());$this->User->updateAll(array('stauts'=>'active'));生成相同的sql查询。
  • @AD7six 我已经研究了你的答案,如果我想根据条件更新,如果没有条件就更新所有没有条件的记录。下面的代码将在这种情况下部分工作。

标签: cakephp cakephp-2.0


【解决方案1】:

这是一个安全锁

条件通常是动态的,基于用户输入。考虑这样一个控制器动作:

function enableAll() {
    $conditions = array();

    ...

    if (whatever) {
        // Update only today's records
        $conditions['created > '] = $yesterday;
    }

    if ($this->Auth->user()) {
        // Update only my records
        $conditions['user_id'] = $this->Auth->user('id');
    }

    $this->Widget->updateAll(
        array('active' => 1),
        $conditions
    );
}

逻辑条件可以是以下两种情况之一:

  • 匹配某些记录或不匹配记录的数组
  • 一个空数组

当它是一个空数组时,开发者的意思是更新所有记录,还是没有条记录?

CakePHP 不能确定,但​​如果通过,一个空的条件数组更有可能是一个错误,其意图是什么都不更新。因此,为了防止开发人员意外更新所有内容,使用了一个不匹配任何记录的条件(WHERE 0 = 1 为假 - 它始终不会匹配任何行。

这就是为什么:

// I definitely want to update the whole table
$model->updateAll($update);

的处理方式与此不同:

// mistake? maybe the conditions have been forgotten...
$model->updateAll($update, array()); 

【讨论】:

  • @Sadikhasan 我不确定你在问什么,答案中没有提到。
  • 如果条件为空数组,则使用 find 查询然后选择所有记录,如果条件为空数组,则在 updateAll 中,为什么不更新所有记录?
  • @AD7six 很高兴知道这种情况已经在核心中得到解决。它可能确实非常有用。
猜你喜欢
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
相关资源
最近更新 更多