Para los que desarrollamos con cakephp alugna vez hemos tenido la necesidad de volcar todas las consultas SQL que se ejecutan en cada petición de nuestra aplicación. Una manera rápida y efectiva de volcar y poder trazar todas las queries es editar el fichero ‘/lib/Cake/Model/Datasource/DboSource.php’ y localizar la function execute() que es la función por la que pasan todas la llamadas SQL.
La herencia de objetos que incluye DboSource, permite llamar al logger de una manera muy sencilla:
[php]
$this->log( $query );
[/php]
De forma que la función quedará así:
[php]
/**
* Queries the database with given SQL statement, and obtains some metadata about the result
* (rows affected, timing, any errors, number of rows in resultset). The query is also logged.
* If Configure::read(‘debug’) is set, the log is shown all the time, else it is only shown on errors.
*
* ### Options
*
* – log – Whether or not the query should be logged to the memory log.
*
* @param string $sql SQL statement
* @param array $options The options for executing the query.
* @param array $params values to be bound to the query.
* @return mixed Resource or object representing the result set, or false on failure
*/
public function execute($sql, $options = array(), $params = array()) {
$options += array(‘log’ => $this->fullDebug);
$this->log( $sql );
$t = microtime(true);
$this->_result = $this->_execute($sql, $params);
if ($options[‘log’]) {
$this->took = round((microtime(true) – $t) * 1000, 0);
$this->numRows = $this->affected = $this->lastAffected();
$this->logQuery($sql, $params);
}
return $this->_result;
}
[/php]
Tengo que recordar que estamos modificando directamente el core de cakephp y que no es la manera adecuada, pero para un apuro es muy rápido y eficaz y claro está que en producción esto no lo podemos poner 😀
Si fuera necesario hacer un override aquí tenemos la documentación para llevarlo a cabo
http://book.cakephp.org/2.0/en/core-utility-libraries/app.html#overriding-classes-in-cakephp
UPDATE:
Si estás tratando de tracear la query final y estás usando ‘prepared staments‘, olvidate. Este tipo de consultas se pasan directamente al motor sql y las procesa automáticamente, con lo que te quedas igual.
Para loggear las consultas en mysql échale un vistazo a la documentación de MySQL
http://dev.mysql.com/doc/refman/5.1/en/query-log.html
Deja una respuesta