方法一
使用返回 yii\db\ActiveQuery 实例的关系,可以直接在代码中提取原始 SQL 查询,例如使用 var_dump()。
例如,如果我们有user 关系:
/**
* @return \yii\db\ActiveQuery
*/
public function getUser()
{
return $this->hasOne(User::className(), ['id' => 'user_id']);
}
然后您可以像这样var_dump() 原始 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();
方法二
这在我看来要简单得多,我个人在调试 SQL 查询时更喜欢这个。
Yii 2 有内置的调试模块。只需将其添加到您的配置中:
'modules' => [
'debug' => [
'class' => 'yii\debug\Module',
],
],
确保您仅在本地拥有它,而不是在生产环境中。如果需要,还可以更改 allowedIPs 属性。
这会在页面底部为您提供功能面板。找到DB 字并单击计数或时间。在此页面上,您可以查看所有已执行的查询并对其进行过滤。
我通常不在 Grid 中过滤它们,而是使用标准浏览器搜索来快速浏览并找到必要的查询(例如,使用表名作为关键字)。
方法3
只需在查询中出错,例如在列名中 - cityy 而不是 city。这将导致数据库异常,然后您可以立即在错误消息中看到生成的查询。