如何在CakePHP 3中的model-> save()上获取SQL查询?

时间:2015-12-15 14:57:37

标签: php cakephp cakephp-3.0

如何在CakePHP 3中查看model-> save()上的SQL查询?有没有办法做到这一点?我希望获得特定的SQL查询,例如当我保存新实体时。

我需要它,因为我想在某些情况下将其保存到日志文件中。

我的bootstrap.php日志配置:

Log::config('current', [
    'className' => 'File',
    'path' => LOGS.DS.date('Y-m').DS,
    'scopes' => ['daily','queriesLog'],
    'file' => date('Y-m-d'),
]);

我想得到什么:

例如,当我保存实体时:

$this->Clients->save($client);

我想记录一些东西,我想用这个日志保存INSERT sql查询

Log::warning('test\n', ['scope' => ['daily']]);

2 个答案:

答案 0 :(得分:3)

解决方案可能是使用查询记录

http://book.cakephp.org/3.0/en/orm/database-basics.html#query-logging

您可以在保存模型时关闭查询记录,然后将其关闭

例如,我有一个评论模型

在我的bootstrap.php中,我做了

Log::config('current', 
[ 
    'className' => 'File', 
    'path' => LOGS.date('Y-m').DS, // you don't need a DS between LOGS and date()
    'scopes' => ['daily','queriesLog'], 
    'file' => date('Y-m-d'), 
]);

在我的控制器中我做了

$conn = \Cake\Datasource\ConnectionManager::get('default');
$comment = $this->Comments->get(5620); // 5620 is the id of one comments of mine
$conn->logQueries(true);
$comment = $this->Comments->get(5619); // 5619 is onother id of one comments of mine
$comment->text = 'Test';
$this->Comments->save($comment);
$conn->logQueries(false);

这样就可以在logs文件夹中创建一个文件,该文件包含以下内容

2015-12-16 13:38:35 Debug: SELECT ... WHERE Comments.id = 5619 LIMIT 1
2015-12-16 13:38:35 Debug: BEGIN
2015-12-16 13:38:35 Debug: UPDATE comments SET text = 'Test' WHERE id = 5619
2015-12-16 13:38:35 Debug: COMMIT

请注意,用于获取评论#5620的查询尚未记录

另请注意,如果您未启用调试工具,则此功能正常

答案 1 :(得分:-1)

将其放入模型

 function getLastQuery() {
        Configure::write(‘debug’,false);
        $dbo = $this->getDatasource();
        $logs = $dbo->getLog();
        $lastLog = end($logs['log']);
        $latQuery = $lastLog['query'];
        echo "<pre>";
        print_r($latQuery);
    }
after $this->save($data);

调用该函数

$this->getLastQuery();

并回应它。

试试吧。