Sentencias Active Record mas comunes Yii2
Sentencias Active Record mas comunes Yii2
Ejemplos de sentencias Active Records más comunes en Yii2.
Como se pueden mostrar las consultas SQL que se ejecutan.
Una forma de debuguear de manera rápido en los casos cuando existe un error es imprimir la consulta que se está generando, esto en Yii2 se puede hacer de la siguiente manera.
$query = ReporteDetalle::find();
echo $query->createCommand()->getRawSql();
echo $query->createCommand()->getRawSql();
Nota. Cuando se usa en conjunto con "->All()" no funciona, así que en este caso puedes quitarle el "->All()" y deberá funcionar.
Esta opción es una opción abreviada de una consulta SQL:
SELECT
findOne()
select * from tabla where id = 1;
Parametro::findOne();
Esta opción es una opción abreviada de una consulta SQL:
Parametro::findOne();
SELECT CON ALIAS 'AS'
Parametro::findOne()
select([
'alias'
])
;
select([
'alias'
])
;
JOIN , WHERE, WHERE AND y más
En las consultas de unión se puede hacer de 2 formas por nombres de tablas como se haría en una consulta normal, y la otra por el nombre de las relaciones creadas en el modelo.
Ejemplo de una consulta por nombres de tablas
Nota importante: Cuando se usa select se invalidan las opciones con las cuales tienes acceso a todos los campos de los modelos, por lo que si estás usando un select es un error común que no se pueda usar el nombre de todos los campos del modelo.
$formularioPregunta = ReporteDetalle::find()
->select('*')
->joinWith('pregunta','pregunta.id = reporte_detalle.pregunta_id ')
->where(['pregunta.pregunta_subcategoria_id' => $id_pregunta_subcategoria ])
->andWhere(['reporte_detalle.reporte_id' => $id_reporte ])
->all();
->select('*')
->joinWith('pregunta','pregunta.id = reporte_detalle.pregunta_id ')
->where(['pregunta.pregunta_subcategoria_id' => $id_pregunta_subcategoria ])
->andWhere(['reporte_detalle.reporte_id' => $id_reporte ])
->all();
Ejemplo de consulta con nombre de modelo y usando nombres de campos en where
$usuarios = Usuario::find()
->select('usuario.*')
->joinWith('usuarioClientes')
->where(['usuario.usuario_tipo_id' => $usuario_tipo_id])
->andWhere(['usuario_cliente.cliente_id' => 1]);
Ejemplo de usar select con dos campos, union y convertirlo a un arreglo.
En este ejemplo estamos usando un select con una unión a una tabla con una relación por modelo y lo estamos convirtiendo un un arreglo.
$MyArray = UsuarioLote::find()
->select(['lote.id','lote.nombre as nombre'])
->joinWith('lote')
->where([ 'usuario_id' => 123456789 ])
->andWhere(['rol_id' => 1 ])
->asArray()
->all();
->select(['lote.id','lote.nombre as nombre'])
->joinWith('lote')
->where([ 'usuario_id' => 123456789 ])
->andWhere(['rol_id' => 1 ])
->asArray()
->all();
WHERE IN
$tipos = [1,2,3]; //Puede ser un arreglo
$query = UsuarioTipo::find()->where(['in', 'id',$tipos]);
$query = UsuarioTipo::find()->where(['in', 'id',$tipos]);
WHERE NOT IN
$usertypes=Usertype::find()
->where(['not in','user_type_id',[2,3,4]])
->all();
->where(['not in','user_type_id',[2,3,4]])
->all();
WHERE OR < > Mayor que ó Menor que
->where(['fraccionamiento_id' => System::getFraccionamientoActivo()])
->andWhere(['<', 'fecha_hora', $fechaActual])
->andWhere(['or', ['evento_estatus_id' => EventoEstatus::PENDIENTE],['evento_estatus_id' => EventoEstatus::AUTORIZADO ] ]);
Árbol jerárquico
A continuación describo un poco de este tipo de consulta SQL:
Los datos jerárquicos se definen como un conjunto de elementos de datos que se relacionan entre sí mediante relaciones jerárquicas. Las relaciones jerárquicas existen allí donde un elemento de los datos es el elemento primario de otro elemento. Entre los ejemplos de datos jerárquicos que se almacenan normalmente en las bases de datos se incluyen los siguientes:
- Una estructura organizativa
- Un sistema de archivos
- Un conjunto de tareas de un proyecto
- Una taxonomía de términos de idioma
- Un gráfico de vínculos entre páginas web
Ejemplo de consulta en SQL:
En esta consulta usamos una estructura de árbol jerárquico para agrupar los datos con group by y utilizamos count para obtner el conteo de los registros dentro del select.
SELECT `preg_padre`.`nombre` AS `pregunta_padre`,
`pregunta`.`nombre` AS `pregunta`,
count( pregunta.nombre) as total
FROM `pregunta_respuesta`
INNER JOIN `pregunta` ON pregunta.id = pregunta_respuesta.pregunta_id
LEFT JOIN `pregunta` `preg_padre` ON preg_padre.id = pregunta.padre_id
WHERE (`pregunta`.`formulario_id`=1)
AND (`pregunta`.`pregunta_tipo_id`=4)
GROUP BY `preg_padre`.`nombre`, `pregunta`.`nombre`;
Convertido quedaría de la siguiente manera
$query = PreguntaRespuesta::find()
->select([
'preg_padre.nombre pregunta_padre',
'pregunta.nombre as pregunta',
'count( pregunta.nombre) as total'
])
->join('INNER JOIN','pregunta','pregunta.id = pregunta_respuesta.pregunta_id')
->join('LEFT JOIN','pregunta preg_padre','preg_padre.id = pregunta.padre_id')
->where(['pregunta.formulario_id'=>1])
->andWhere(['pregunta.pregunta_tipo_id'=>4])
->groupBy(['preg_padre.nombre', 'pregunta.nombre']);
Convierte una consulta a un arreglo
Esta opción es muy útil para convertir cualquier consulta a un arreglo, se pueden agregar consultas más complejas para finalmente convertirlas en arreglo.
Ejemplo #1
$preguntas = Pregunta::find()->asArray()->all();
foreach ($preguntas as $item){
echo "<br>" .$item["nombre"];
echo "<br>" .$item["preguntaSubcategoria"]["nombre"];
}
foreach ($preguntas as $item){
echo "<br>" .$item["nombre"];
echo "<br>" .$item["preguntaSubcategoria"]["nombre"];
}
Ejemplo #2
Obtiene una solo valor utilizando un select y convirtiéndolo en arreglo.
ParametroCliente::find()
->select(['clave' => 'parametro_cliente.valor'])
->innerJoin('parametro','parametro.id = parametro_cliente.parametro_id')
->where(['and', ['=', 'parametro_cliente.cliente_id', $clienteId ], ['=', 'parametro.clave', $clave ]])
->asArray()
->one();
->select(['clave' => 'parametro_cliente.valor'])
->innerJoin('parametro','parametro.id = parametro_cliente.parametro_id')
->where(['and', ['=', 'parametro_cliente.cliente_id', $clienteId ], ['=', 'parametro.clave', $clave ]])
->asArray()
->one();
SELECT COUNT
La función "count()" del active record tiene una limitánte y es que no es posible utilizarla de forma separada ejemplo:
La siguiente consulta puede leer el número de coincidencias y devolverá un entero con el número de coincidencias.
$modelNotificacionesWeb = NotificacionWeb::find();
$modelNotificacionesWeb ->where(['usuario_receptor' => $usuario_id ])
->andWhere(['notificacion_estatus_id' => 1 ])
->count();
$modelNotificacionesWeb ->where(['usuario_receptor' => $usuario_id ])
->andWhere(['notificacion_estatus_id' => 1 ])
->count();
Esto arrojaría algo inválido, hasta el momento no entiendo el por qué pero si intentan utilizarla de esta manera no les funcionará, al menos hasta la versiónde Yii "2.0.14":
Ejemplo #1 Count
La siguiente consulta puede leer el número de coincidencias y devolverá un entero con el número de coincidencias.
$modelNotificacionesWeb = NotificacionWeb::find()
->where(['usuario_receptor' => $usuario_id ])
->andWhere(['notificacion_estatus_id' => 1 ])
->count();
->where(['usuario_receptor' => $usuario_id ])
->andWhere(['notificacion_estatus_id' => 1 ])
->count();
Ejemplo #2 Count
$total = DocumentoValidado::find()->joinWith('documentacionArchivo')
->joinWith('documentacionArchivo.documentacion')
->joinWith('documentacionArchivo.documentacion.documentacionTipo')
->where(['documento_validado.validado' => 1])
->andWhere(['<', 'documentacion.fecha_hora_expiracion', $mysqlExpresion])
->count();
->joinWith('documentacionArchivo.documentacion')
->joinWith('documentacionArchivo.documentacion.documentacionTipo')
->where(['documento_validado.validado' => 1])
->andWhere(['<', 'documentacion.fecha_hora_expiracion', $mysqlExpresion])
->count();
Actualizado: 12-Diciembre-2020
Me encanta este sitio, lo amo.
ResponderEliminar