Магия UpdateAll

#cakephp #cakephp-2.0

#cakephp #cakephp-2.0

Вопрос:

Я написал приведенный ниже код в cakephp для и 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. Находясь на стороне разработчика, мы должны следить за преобразованием, выполняемым cakephp, вторая часть функции UpdateAll содержит условия, мы не должны передавать условие, если у нас их нет…

2. Лучше спросить создателя CakePHP, возможно, они пропустили рассмотрение этой ситуации.

3. Как я могу спросить команду создателей CakePHP?

4. @AD7six Конечно, это не ошибка. Я думаю, это можно было бы рассматривать как улучшение. так что $this->User->updateAll(array('stauts'=>'active'),array()); и $this->User->updateAll(array('stauts'=>'active')); генерируйте тот же SQL-запрос.

5. @AD7six Я уже изучаю ваш ответ, позвольте, если я хочу обновить условия, и если нет условия, просто обновите все записи без условий. приведенный ниже код будет частично работать в этой ситуации.

Ответ №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 false — оно не будет соответствовать строкам, всегда.).

Вот почему это:

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

обрабатывается иначе, чем это:

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

Комментарии:

1. @Sadikhasan я не уверен, о чем вы спрашиваете, что не рассматривается в ответе.

2. С помощью запроса find, если условие равно пустому массиву, выберите все записи, а в UpdateAll, если условие равно пустому массиву, почему бы не обновить все записи?

3. @AD7six Очень приятно знать, что этот случай уже рассмотрен в ядре. Это может быть действительно очень полезно.