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
中.这将导致数据库异常,然后您可以立即在错误消息中看到生成的查询.