我在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/