Как посмотреть sql запрос построенный yii2
  • 857

Как посмотреть строку запроса sql построенную в Yii2

Автор: admin | 07 мая (Пн.) 2018г. в 12ч.39м.

Бывает необходимость при формировании тех или иных запросов с помощью ActiveRecord посмотреть, как
формируется непосредственно строка запроса к базе. Особенно это актуально, если нужно построить
какой-нибудь сложный запрос со свзями на выборку, с JOIN и тому подобное. Да, можно использовать дебаг
панель в yii2. Но если нужно вывесть такой запрос на страницу через привычный var_dump и видеть его сразу,
без поиска в куче других запросов в панели разработчика, то есть такой прием.

В экшене формируем запрос и тут же выводим строку запроса
 $model = BlogArticles::find();
 //для отладки
 var_dump($model->prepare(\Yii::$app->db->queryBuilder)->createCommand()->rawSql);​

Выведется string 'SELECT * FROM `blogArticles`' (length=28)

Следует учесть, что для метода prepare() нужно формировать \yii\db\ActiveQuery , а метод one() или all() или count() как
конечный вариант перед выводом в var_dump ставить не следует, иначе ничего не получится, если не просматриваются
связанные модели, как в примере ниже.

Если в модели есть связи, то делаем так:

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

В нужном месте, например в экшене:

$model = BlogArticles::find()->where(['id' => 1])->one();

//для отладки
var_dump($model->getCategory()->prepare(\Yii::$app->db->queryBuilder)->createCommand()->rawSql);

Обратите внимание, что вы должны вызывать его так, а не $model->category-> ... (последний возвращает
экземпляр BlogCategories).

Дело в том, что prepare реализован в yii\db\ActiveQuery. Поэтому и приходится так изащряться и вызывать
этот метод у соответствующих объектов.

Можно еще попробовать вывести так:

var_dump($model->getCategory()->createCommand()->sql);

Выведется такой результат без подстановки:
 string 'SELECT * FROM `blogCategories` WHERE `id`=:qp0' (length=46)
Еще один действенный способ, можно сказать хитрость. Просто сделайте ошибку в запросе, например, в столбце name - cityy, а не city. Это приведет к ошибке базы данных, а затем вы сможете мгновенно увидеть сгенерированный запрос в сообщении об ошибке.

Приветствую!

Меня зовут Сергей. Я - автор этого блога.

Если Вам был полезен материал на моем сайте, поддержите пожалуйста мой проект, чтобы о нем узнали другие люди - кликните plizz :) на иконку в соц. сети, чтобы поделиться материалом с другими.