Cakephp см. скомпилированный SQL-запрос перед выполнением
Мой запрос получает ошибку тайм-аута при каждом прогоне. Его разбиение на страницы с присоединениями.
Я хочу отлаживать SQL, но поскольку я получаю таймаут, я не вижу его.
Как я могу просмотреть скомпилированный SQL-запрос перед выполнением?
Код торта:
$this -> paginate = array(
'limit' => '16',
'joins' => array( array(
'table' => 'products',
'alias' => 'Product',
'type' => 'LEFT',
'conditions' => array('ProductModel.id = Product.product_model_id')
)),
'fields' => array(
'COUNT(Product.product_model_id) as Counter',
'ProductModel.name'
),
'conditions' => array(
'ProductModel.category_id' => $category_id,
),
'group' => array('ProductModel.id')
);
Ответы
Ответ 1
Прежде всего, установите для переменной debug
значение 2 в app/config/config.php
.
Затем добавьте:
<?php echo $this->element('sql_dump');?>
в конце вашего макета. Это действительно должно быть прокомментировано в вашем макете торта по умолчанию.
Теперь вы сможете увидеть все SQL-запросы, которые идут в базу данных.
Теперь скопируйте запрос и используйте команду SQL EXPLAIN (ссылка для MySQL) по базе данных, чтобы увидеть, что делает запрос в СУБД. Подробнее об отладке CakePHP см. здесь.
Так как ваш script даже не делает рендеринг, вы можете попытаться получить последний журнал непосредственно из источника данных с помощью:
function getLastQuery()
{
$dbo = $this->getDatasource();
$logs = $dbo->getLog();
$lastLog = end($logs['log']);
return $lastLog['query'];
}
Это должно быть в модели, так как функция getDatasource()
определена в модели.
Осмотрите всю переменную $logs
и посмотрите, что там.
Ответ 2
Try...
function getLastQuery($model) {
$dbo = $model->getDatasource();
$logData = $dbo->getLog();
$getLog = end($logData['log']);
echo $getLog['query'];
}
Ответ 3
Еще одна вещь, которую вы можете сделать, это...
Перейдите к Cake/Model/DataSource/DboSource.php и найдите функцию execute() и напечатайте переменную $sql.
Это должно печатать sql.
Это, конечно, не самый чистый способ (по мере того, как вы меняете каталог Cake).. но, конечно, было бы быстрее всего отлаживать, если что-то не работает с sql.
Ответ 4
class YourController extends AppController {
function testfunc(){
$this->Model->find('all', $options);
echo 'SQL: '.$this->getLastQuery();
}
function getLastQuery()
{
$dbo = ConnectionManager::getDataSource('default');
$logs = $dbo->getLog();
$lastLog = end($logs['log']);
return $lastLog['query'];
}
}
или вы можете получить весь запрос, добавив следующую строку в функцию execute() в lib/Cake/Model/DataSource.php
Debugger::dump($sql);
Ответ 5
Простой способ показать весь выполненный запрос вашей модели:
$sqllog = $this->ModelName->getDataSource()->getLog(false, false);
debug($sqllog);
Ответ 6
установите для параметра debug значение 2 в app/config/config.php.
echo $this->Payment->save();
Out put like = > SQL Query: INSERT INTO photoora_photoorange
. payments
ЦЕННОСТИ (*******)
[insert query] [2]
Ответ 7
установите для параметра debug значение 2 в app/config/config.php.
введите здесь описание изображения
введите здесь описание изображения