方法 1
使用返回实例的关系,可以直接在代码中提取原始 SQL 查询,例如使用 。yii\db\ActiveQuery
var_dump()
例如,如果我们有关系:user
/**
* @return \yii\db\ActiveQuery
*/
public function getUser()
{
return $this->hasOne(User::className(), ['id' => 'user_id']);
}
然后,您可以像这样使用原始 SQL:var_dump()
var_dump($model->getUser()->prepare(Yii::$app->db->queryBuilder)->createCommand()->rawSql);
exit();
请注意,您应该这样称呼它,而不是(后者返回实例)。$model->user->...
User
但是对于您来说,这是不可能的,因为会立即返回。您可以在没有的情况下进行部分查询,但我认为这不方便。count()
int
var_dump()
count()
请注意,您可以使用此方法转储任何实例(不仅仅是由关系返回的实例)生成的 SQL,例如:ActiveQuery
$query = User::find()->where(['status' => User::STATUS_ACTIVE]);
var_dump($query->prepare(Yii::$app->db->queryBuilder)->createCommand()->rawSql);
exit();
方法 2
在我看来,这要简单得多,我个人在调试SQL查询时更喜欢这个。
Yii 2 有内置的调试模块。只需将其添加到您的配置中:
'modules' => [
'debug' => [
'class' => 'yii\debug\Module',
],
],
确保仅在本地拥有它,而不是在生产环境中使用。如果需要,还要更改属性。allowedIPs
这将在页面底部为您提供功能面板。找到单词,然后单击计数或时间。在此页上,您可以查看所有已执行的查询并对其进行筛选。我通常不会在Grid中过滤它们,而是使用标准的浏览器搜索来快速浏览并找到必要的查询(例如,使用表名作为关键字)。DB
方法 3
只需在查询中出错,例如在列名中 - 而不是 .这将导致数据库异常,然后您可以立即在错误消息中看到生成的查询。cityy
city