我在cakephp for和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';
我不知道为什么会这样。
如果您不理解我的问题,请在评论中告诉我,我会在短期内解释。
答案 0 :(得分:16)
根据用户输入,条件通常是动态的。考虑一下这样的控制器动作:
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
为false - 它始终不匹配任何行。)。
这就是为什么:
// I definitely want to update the whole table
$model->updateAll($update);
的处理方式与此不同:
// mistake? maybe the conditions have been forgotten...
$model->updateAll($update, array());