CakePHP см скампіляваны SQL Query перад выкананнем

Мой запыт атрымлівае памылку тайм-аўту пры кожным запуску. Яго пагинация з злучэннямі.
Я хачу, каб адладзіць SQL, але так як я атрымліваю тайм-аўт, я не магу бачыць гэта.

Як я магу бачыць, скампіляваны SQL Query перад выкананнем?


Некаторы торт код:

$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')
    );
13

7 адказы

Па-першае, усталюйце адладкі зменную 2 у дадатак/Config/config.php .

Затым дадаць:

<?php echo $this->element('sql_dump');?>

у канцы вашага макета. Гэта павінна быць на самой справе закаментаваўшы ў макеце па змаўчанні торта.

<�Моцны> Зараз вы зможаце ўбачыць ўсе запыты SQL, якія ідуць у базу дадзеных.

Цяпер скапіруйце запыт і выкарыстоўваць SQL EXPLAIN каманды (спасылка для MySQL) над базай дадзеных, каб убачыць, што запыт робіць у СКБД . Больш падрабязную інфармацыю аб CakePHP праверкі адладкі .

Так як ваш сцэнар нават не робіць, вы можаце паспрабаваць, каб атрымаць апошні часопіс непасрэдна з крыніцы дадзеных з:

function getLastQuery()
{
    $dbo = $this->getDatasource();
    $logs = $dbo->getLog();
    $lastLog = end($logs['log']);
    return $lastLog['query'];
}

Гэта павінна быць у мадэлі, так як GetDataSource() функцыя вызначаецца ў мадэлі. Агледзець увесь $ краж зменную і паглядзець, што там.

26
дададзена
дзякуй. але гэта не працуе. праблема заключаецца ў тым, што сцэнар ніколі не дабрацца да часткі рэндэрынгу, так як theh тайм-аўт знаходзіцца на ўзроўні кантролера дзеянняў.
дададзена аўтар yossi, крыніца
І гэты скрыпт вяртае апошні запыт ад папярэдняга выканання?
дададзена аўтар yossi, крыніца
Адказ абноўлены.
дададзена аўтар Borislav Sabev, крыніца
Не зусім упэўнены, так як я не remmember, што дакладнае вяртанне. Проста паспрабуйце. Ён напэўна верне часопіс апошняга запыту. Проста скінуць $ часопісы зменную і агледзіце яе.
дададзена аўтар Borislav Sabev, крыніца
Выкарыстоўвайце ConnectionManager :: GetDataSource ( «па змаўчанні») , каб атрымаць крыніца дадзеных пры выкліку з кантролера
дададзена аўтар Kangur, крыніца

Яшчэ адна рэч, якую вы можаце зрабіць, гэта ....

Перайсці да Cake/Model/DataSource/DboSource.php і знайсці функцыі Execute() і друк $ SQL зменнай. Гэта павінна надрукаваць SQL.

Гэта, вядома, не самы чысты спосаб (як вы змяняеце каталог Cake) .. але, вядома, будзе хуткімі толькі для адладкі, калі нешта не працуе з SQL.

5
дададзена
Дзякуй! Гэта адзін дапамагло :)
дададзена аўтар olleh, крыніца
Адказ таксама карысна для асяроддзяў каманднага радка, дзе ў вас няма доступу да sql_dump элемента.
дададзена аўтар Curtis Gibby, крыніца
Калі ўсё астатняе цалкам няспраўная з-за блукаючай запыту, часам гэта самы карысны спосаб!
дададзена аўтар almcnicoll, крыніца
Try...
function getLastQuery($model) {
    $dbo = $model->getDatasource();
    $logData = $dbo->getLog();
    $getLog = end($logData['log']);
    echo $getLog['query'];
}
4
дададзена
Гэтая функцыя добра працуе на серверы з PHP 5.4.32, але не на серверы з 5.5.16 на гэтым выпадку $ dbo-> getLog() проста пуста. На іншым серверы я атрымліваю поўныя часопісы. Любы любая ідэя, чаму функцыя не працуе на 5.5. версія?
дададзена аўтар user1555112, крыніца
@ User1555112 Я не ўпэўнены, што праблема ёсць, але яна выдатна працуе на 5.6.1
дададзена аўтар Phillip Macdonald, крыніца
@ User1555112 верагодна, вы мелі рэжым адладкі выключаны ў вашай канфігурацыі, калі вы карыстаецеся this-> увайсці або CakeLog
дададзена аўтар LogixMaster, крыніца

Просты спосаб паказаць усё выконваецца запыт вашай дадзенай мадэлі:

  $sqllog = $this->ModelName->getDataSource()->getLog(false, false);       
  debug($sqllog);
2
дададзена
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'];
    }
}

ці вы можаце атрымаць усе запыты, дадаўшы наступны радок у функцыю выканання() у Lib/Cake/Model/DataSource.php

Debugger::dump($sql);
1
дададзена

ўсталяваць зменныя адладкі 2 у дадатку/Config/config.php.

enter image description here

And enter image description here

1
дададзена

ўсталяваць зменныя адладкі 2 у дадатку/Config/config.php.

echo $this->Payment->save();

Out put like =>SQL Query: INSERT INTO photoora_photoorange.payments VALUES (*******)

[Уставіць запыт] [2]

0
дададзена