Magic of UpdateAll

Я написал код ниже в cakephp for и updateAll, например

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

Вышеупомянутый эквивалент кода SQL создается таким образом

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

Когда я пишу updateAll в cakephp, как показано ниже

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

Этот эквивалент кода SQL создается таким образом

UPDATE User SET status='active';

Я не знаю, почему это происходит.

Если вы не поймете мой вопрос, дайте мне знать в комментариях, я объясню вкратце.

Ответ 1

Это предохранитель

Условия часто динамические, основанные на пользовательских вводах. Рассмотрим действие контроллера следующим образом:

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

    ...

    if (whatever) {
        // Update only today 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());