Как я могу просмотреть 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();
и эхо его.
Попробуй.