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();

Nota. Cuando se usa en conjunto con "->All()" no funciona, así que en este caso puedes quitarle el "->All()" y deberá funcionar.

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'
])
;



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();


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();

WHERE IN


$tipos = [1,2,3]; //Puede ser un arreglo
$query = UsuarioTipo::find()->where(['in', 'id',$tipos]);

WHERE NOT IN


$usertypes=Usertype::find()
           ->where(['not in','user_type_id',[2,3,4]])
           ->all();

WHERE  OR < > Mayor que ó Menor que



$eventosAR = Evento::find()
                ->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"];
}



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 COUNT

La función "count()" del active record tiene una limitánte y es que no es posible utilizarla de forma separada ejemplo: 


$modelNotificacionesWeb = NotificacionWeb::find();
                $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();



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();

Actualizado: 12-Diciembre-2020

Comentarios

Publicar un comentario

Aprende Yii2


Lo más Visto

Tutorial de implementación de calendario de rango de fechas con Karkit en gridView

Cómo evitar el reenvío de formulario

Como instalar Yii en Windows usando App Serv

hostinger

ventana bienvenida