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-> обновление ()

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

2

Решение

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

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

$affectedRows = $return->rowCount();

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

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

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

п.с.

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

2

Другие решения

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

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

Update2: ( попробуй это )

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();
}
0

По вопросам рекламы [email protected]