我正在这样做:

$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相关问答推荐

如何退回当年的所有参赛作品?""

将主表与历史表连接以获取主表的当前汇率以及历史表中的上一个和最后一个汇率

PostgreSQL抽奖查询

查询每周数据(周一至周日),避免年度日期重叠

如何将我的联接数据放入每个用户每月多行的列中?

正在try 从SQL获取最新的ID和一个唯一名称

仅当交叉应用返回单值时才更新记录

使用generate_series()时,LEFT联接缺少日期/间隔

VS代码无法识别SQL代码中带括号的字符串

如何根据 SQL 中的阈值标记一个集群中的所有值?

根据要过滤的列的值进行联接和分组

如何从postgresql中的项目映射(关联数组)设置值?

如何在 JSONB 数组的每个对象中添加新的键值对- PostgreSQL

获取记录的上一个值,并将其与当前值一起显示

更新之前如何获得价值

查询中获取审批者不起作用

MS ACCESS 错误插入 X(...) 从 A 联合 Select ... 从 B

SQL:如何从时间戳数据生成时间序列并计算不同事件类型的累计总和?

T-SQL 查询计算日期在其他列中定义的日期之间绑定的行数

在sql server中创建唯一标识符列