我正在这样做:

$students = Student::find()->all();
    return $this->render('process', array('students' => $students));

然后在视图中:

foreach($students as $student)
    {
        echo $student->name . ',  ';
        echo $student->getQuizActivitiesCount(); ?> <br /> <?php
    }

我希望看到正在执行sql查询.一个学生"有很多"测验活动,查询执行得很好,但我需要查看原始SQL.这可能吗?

推荐答案

Method 1

对于返回yii\db\ActiveQuery个实例的关系,可以直接在代码中提取原始SQL查询,例如var_dump().

例如,如果我们有user个关系:

/**
 * @return \yii\db\ActiveQuery
 */
public function getUser()
{
    return $this->hasOne(User::className(), ['id' => 'user_id']);
}

然后,您可以像下面这样使用原始SQL:

var_dump($model->getUser()->prepare(Yii::$app->db->queryBuilder)->createCommand()->rawSql);
exit();

注意,应该这样调用它,而不是$model->user->...(后者返回User个实例).

但在你的情况下,这是不可能的,因为count()会立即返回int.你可以在没有count()的情况下进行var_dump()次部分查询,但我认为这不方便.

请注意,您可以使用此方法转储生成的任意ActiveQuery个实例的SQL(不仅仅是通过关系返回的实例),例如:

$query = User::find()->where(['status' => User::STATUS_ACTIVE]);
var_dump($query->prepare(Yii::$app->db->queryBuilder)->createCommand()->rawSql);
exit();

Method 2

在我看来,这要简单得多,我个人更喜欢在调试SQL查询时使用这种方法.

Yii 2有内置的调试模块.只需将其添加到配置中:

'modules' => [
    'debug' => [
        'class' => 'yii\debug\Module',
    ],
],

确保只在本地使用,而不是在生产中使用.如果需要,还可以更改allowedIPs属性.

这将在页面底部提供功能面板.找到DB个单词,点击count或time.在此页面上,您可以查看所有已执行的查询并对其进行筛选.

Method 3

只需在查询中出错,例如在列名-cityy而不是city中.这将导致数据库异常,然后您可以立即在错误消息中看到生成的查询.

Sql相关问答推荐

一系列日期中每个日期的分组聚合计数

根据 SQL 中另一表的选择从一个表中选择数据

加入日期表,带有脏日期字段

如何在 athena 中加入 unnest 函数?

仅向自己显示受惩罚用户的聊天消息

在 SQL 中搜索 WHERE 值为 SELECT,为什么现在可以工作?

PostgresQL查询以计算一天内的时间间隔

SQL查询根据两列对日期进行排序

在多个数据集中查找相同的行

如何计算给定状态的最后记录?

如何按行对项目进行分组

ORDER BY 首先具有特定值

用于排除特定邮箱域的 Where 子句

BigQuery JSON - 标量子查询产生了多个元素

oracle json_value vs. json_table 解释查询计划

适用于所有(或大多数)数据库的高效 SQL 测试查询或验证查询

如何使用 SQLPLUS 假脱机到 CSV 格式的文件?

如何在带有“时间”字段的 postgresql 中按小时分组?

Postgresql 表存在,但查询时得到“关系不存在”

批量插入,如果在 Postgres 上发生冲突(批量 upsert)则更新