Intereting Posts

Как получить SQL-запрос в model-> save () в CakePHP 3?

Как я могу просмотреть SQL-запрос в model-> save () в CakePHP 3? Есть какой-либо способ сделать это? Я хочу получить конкретный SQL-запрос, например, при сохранении нового объекта.

Мне нужно это, потому что я хочу сохранить это в файле журнала в некоторых случаях.

Моя конфигурация log bootstrap.php:

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

Что я хочу получить:

например, когда я сохраняю объект:

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

Я хочу что-то записать, и я хочу сохранить SQL-запрос INSERT с этим журналом

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

Решением может быть использование журнала запросов

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('Ym-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); 

Таким образом, файл создается в папке журналов, и файл содержит следующее

 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, не был зарегистрирован

Также обратите внимание, что это работает, если у вас нет debugkit enabled

Поместите это в модель

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

и эхо его.

Попробуй.