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]