これを行うには、ログに記録するクエリの種類にフィルターを追加します。それらをブートストラップ ファイルでグローバルに定義したり、コントローラで「ローカル」に定義したりできます。次の例では、クエリが適切に出力されませんが、データがある場合は非常に簡単に実行できます。
以下のコードは情報を取得する方法を示していますが、きれいな方法で出力していません。
Connections::get('default')->applyFilter('read', function($self, $params, $chain) {
echo "===========</br>\n";
if (is_object($params['query'])){
var_dump($params['query']->conditions());
}
else{
echo 'Query: '; var_dump($params['query']); echo "</br>\n";
}
$time = microtime(true);
$next = $chain->next($self, $params, $chain);
$time = microtime(true) - $time;
echo "Results: " . count((array)$next) . "</br>\n";
echo "Time: " . $time . "</br>\n";
return $next;
});
ヘッダーの前に印刷されるため、フィルターから直接データを送信すると、ページが役に立たなくなることに注意してください。ただし、フィルターのデータを出力する代わりに配列に保存すると、後でビューで使用できます。たとえば、この情報をページに追加するためのテンプレートを作成できます。
編集:更新されたコード
Edit2: 実行される正確な SQL を常に取得する方法を追加しました。を取得するには
Connections::get('default')->applyFilter('_execute', function($self, $params, $chain) {
echo "SQL: " . $params['sql'] . "</br>\n";
$time = microtime(true);
$next = $chain->next($self, $params, $chain);
$time = microtime(true) - $time;
$count = 0;
while ($next->next())
$count++;
$next->rewind();
echo "Count: " . $count . "</br>\n";
echo "Time: " . $time . "</br>\n";
echo "=====================</br>\n";
return $next;
});