我在cakephp中为和updateAll查询编写了以下代码,例如

$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';

我不知道为什么会这样。

如果您不明白我的问题,请在评论中让我知道,我将在稍后进行解释。

最佳答案

这是一个安全陷阱
条件通常基于用户输入是动态的。考虑这样的 Controller Action :

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());
    

    关于cakephp - UpdateAll的魔力,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24259110/

    10-15 02:59