CakePHP 3.0: как проверить выполнение обновлений данных в построителе запросов

Я использую cakePHP 3.0 для внутреннего API. Это мой код

namespace App\Controller;

use Cake\Datasource\ConnectionManager;
use Cake\ORM\TableRegistry;
use App\Controller\AppController;
use Cake\Routing\Router;

class MainController extends AppController {

   public function myMethod() {
       $groupRegistry = TableRegistry::get('MyModel');
       $query = $groupRegistry->query();
       $params = $this->request->data;

       $return = $query->update()
               ->set(['my_flag' => $params['flag']])
               ->where(['id' => $params['id']])
               ->execute();

       if (empty($return)) {
           return $this->outStatusJson('ERR100', 'Error Updating.');
       }

     return $this->outStatusJson('0', 'OK');
  }
}

Я не могу отследить ответ $query->update()

Любая помощь спасет мой день.

2 ответа

Решение

Query::execute() вернет объект оператора, который реализует \Cake\Database\StatementInterfaceи, таким образом, выставляет rowCount() метод, который возвращает количество строк, затронутых оператором.

Так что вы можете просто сделать:

$affectedRows = $return->rowCount();

И есть также Table::updateAll() метод, который вы могли бы использовать вместо этого, он делает именно то, что вы делаете там (+ закрытие курсора), и возвращает количество затронутых строк.

$affectedRows = $groupRegistry->updateAll(
    ['my_flag' => $params['flag']],
    ['id' => $params['id']]
);

Смотрите также

п.с.

Я надеюсь, что вы знаете, что вы там делаете, когда используете низкоуровневые запросы, ваши данные не будут проверяться, а события сохранения модели не инициируются!

Используйте метод модели getAffectedRows() как описано в документации к CakePHP.

Согласно документу: Model::getAffectedRows() - Возвращает количество строк, затронутых последним запросом.

Обновление 2: (попробуйте это)

public function getAffectedRows() {
    // Returns the number of rows affected by the last query
    //return $this->getDataSource()->lastAffected();

      $db =& ConnectionManager::getDataSource($this->useDbConfig);
      return $db->lastAffected();
}
Другие вопросы по тегам