I'm doing this:
$students = Student::find()->all();
return $this->render('process', array('students' => $students));
and then this in the view:
foreach($students as $student)
{
echo $student->name . ', ';
echo $student->getQuizActivitiesCount(); ?> <br /> <?php
}
i would like to see the sql query being performed. a student "has many" quiz activities, and the query performs perfectly, but i need to see the raw SQL. is this possible?
In order to log/track every/all queries:
extend
\yii\db\Connection
and overridecreateCommand
method, like below:Then, simply change your db connection in your db config like below:
Now, you can track/read/... all queries executed by
db
connection.Try like,
Output:
In addition to arogachev answer, when you already work with an
ActiveQuery
object, here is the line I search to view the rawsql.you can try this, assume you have a query given like:
or to get the SQL with all parameters included try:
Method 1
With relations that return
yii\db\ActiveQuery
instance it's possible to extract the raw SQL query directly in code for example withvar_dump()
.For example if we have
user
relation:You can then
var_dump()
the raw SQL like that:Note that you should call it like that and not
$model->user->...
(the latter returnsUser
instance).But in your case it's not possible because
count()
immediately returnsint
. You canvar_dump()
partial query withoutcount()
, but I think it's not convenient.Note that you can use this method for dumping generated SQL of any
ActiveQuery
instances (not only those that were returned by relation), for example:Method 2
This is much simpler in my opinion and I personally prefer this one when debugging SQL queries.
Yii 2 has built-in debug module. Just add this to your config:
Make sure you only have it locally and not on production. If needed, also change
allowedIPs
property.This gives you functional panel at the bottom of the page. Find the
DB
word and click on either count or time. On this page you can view all executed queries and filter them. I usually don't filter them in Grid and use standard browser search to quickly navigate through and find the necessary query (using the table name as keyword for example).Method 3
Just make an error in query, for example in column name -
cityy
instead ofcity
. This will result as database exception and then you can instantly see the generated query in error message.when you have a query object you can also use
to return the Raw SQL with the parameters included or
which will output the Sql with parameters separately.