php - guide - yii::$ app-> db-> createcommand
¿Registra la consulta SQL real usando ActiveRecord con Yii2? (7)
Estoy haciendo esto:
$students = Student::find()->all();
return $this->render(''process'', array(''students'' => $students));
y luego esto en la vista:
foreach($students as $student)
{
echo $student->name . '', '';
echo $student->getQuizActivitiesCount(); ?> <br /> <?php
}
Me gustaría ver que se realiza la consulta SQL. un alumno "tiene muchas" actividades de prueba, y la consulta funciona perfectamente, pero necesito ver el SQL sin formato. ¿es posible?
Además de la respuesta arogachev, cuando ya trabaja con un objeto ActiveQuery
, aquí está la línea I de búsqueda para ver el rawsql.
/* @var $studentQuery ActiveQuery */
$studentQuery = Student::Find();
// Construct the query as you want it
$studentQuery->where("status=3")->orderBy("grade ASC");
// Get the rawsql >-- The line I usually use --<
var_dump(studentQuery->prepare(Yii::$app->db->queryBuilder)->createCommand()->rawSql);
// Run the query
$studentQuery->all();
Para registrar / seguir todas las consultas:
extienda /yii/db/Connection
y anule el método createCommand
, como a continuación:
namespace app/base;
class Connection extends /yii/db/Connection {
public function createCommand($sql = null, $params = array()) {
$createCommand = parent::createCommand($sql, $params);
$rawSql = $createCommand->getRawSql();
// ########### $rawSql -> LOG IT / OR DO ANYTHING YOU WANT WITH IT
return $createCommand;
}
}
Luego, simplemente cambie su conexión de db en su configuración de db como se muestra a continuación:
''db'' => [
''class'' => ''app/base/Connection'', // #### HERE
''dsn'' => ''pgsql:host=localhost;dbname=dbname'',
''username'' => ''uname'',
''password'' => ''pwd'',
''charset'' => ''utf8'',
],
Ahora puede seguir / leer / ... todas las consultas ejecutadas por la conexión db
.
Prueba como,
$query = Yii::$app->db->createCommand()
->update(''table_name'', [''title'' => ''MyTitle''],[''id'' => ''1'']);
var_dump($query->getRawSql()); die();
$query->execute();
Salida:
string ''UPDATE `table_name`
SET `title`=''MyTitle'' WHERE `id`=''1''
'' (length=204)
Puedes probar esto, suponiendo que tienes una consulta como:
$query = new Books::find()->where(''author=2'');
echo $query->createCommand()->sql;
o para obtener el SQL con todos los parámetros incluidos, intente:
$query->createCommand()->getRawSql()
Si desea registrar todas las consultas relacionales de ActiveRecord
en la aplicación de consola, no todos los métodos propuestos son útiles. Muestran solo SQL principal en la tabla de registros activos, /yii/debug/Module
funciona solo en el navegador.
El método alternativo para obtener todas las consultas SQL ejecutadas es registrarlas agregando un FileTarget específico a la configuración:
''log'' => [
''targets'' => [[
...
], [
''class'' => ''yii/log/FileTarget'',
''logFile'' => ''@runtime/logs/profile.log'',
''logVars'' => [],
''levels'' => [''profile''],
''categories'' => [''yii/db/Command::query''],
''prefix'' => function($message) {
return '''';
}
]]
]
ACTUALIZAR
Con el fin de iniciar sesión insertar / actualizar / eliminar consultas también se debe agregar yii/db/Command::execute
categoría:
''categories'' => [''yii/db/Command::query'', ''yii/db/Command::execute'']
cuando tienes un objeto de consulta también puedes usar
$query->createCommand()->getRawSql()
para devolver el SQL crudo con los parámetros incluidos o
$query->createCommand()->sql
que generará el Sql con parámetros por separado.
Método 1
Con las relaciones que devuelven la yii/db/ActiveQuery
, es posible extraer la consulta SQL sin procesar directamente en el código, por ejemplo, con var_dump()
.
Por ejemplo, si tenemos user
relación de user
:
/**
* @return /yii/db/ActiveQuery
*/
public function getUser()
{
return $this->hasOne(User::className(), [''id'' => ''user_id'']);
}
A continuación, puede var_dump()
el SQL sin procesar de esa manera:
var_dump($model->getUser()->prepare(Yii::$app->db->queryBuilder)->createCommand()->rawSql);
exit();
Tenga en cuenta que debe llamarlo así y no $model->user->...
(este último devuelve instancia de User
).
Pero en su caso no es posible porque count()
devuelve inmediatamente int
. Puede var_dump()
consulta parcial sin count()
, pero creo que no es conveniente.
Tenga en cuenta que puede utilizar este método para eliminar el SQL generado de cualquier instancia de ActiveQuery
(no solo las que se devolvieron por relación), por ejemplo:
$query = User::find()->where([''status'' => User::STATUS_ACTIVE]);
var_dump($query->prepare(Yii::$app->db->queryBuilder)->createCommand()->rawSql);
exit();
Método 2
Esto es mucho más simple en mi opinión y yo personalmente prefiero este cuando depuro consultas SQL.
Yii 2 tiene un módulo de depuración incorporado. Solo agrega esto a tu configuración:
''modules'' => [
''debug'' => [
''class'' => ''yii/debug/Module'',
],
],
Asegúrese de tenerlo solo localmente y no en producción. Si es necesario, también cambie la propiedad allowedIPs
.
Esto le da panel funcional en la parte inferior de la página. Encuentre la palabra DB
y haga clic en el recuento o el tiempo. En esta página puede ver todas las consultas ejecutadas y filtrarlas. Por lo general, no los filtro en Grid y uso la búsqueda estándar en el navegador para navegar rápidamente y encontrar la consulta necesaria (usando el nombre de la tabla como palabra clave, por ejemplo).
Método 3
Simplemente haga un error en la consulta, por ejemplo, en el nombre de la columna - cityy
lugar de city
. Esto dará como resultado una excepción de base de datos y luego puede ver instantáneamente la consulta generada en un mensaje de error.