administrador.base.orm.where.genera_filtros_sql - gamboamartin/administrador GitHub Wiki
genera_filtros_sql
La función genera_filtros_sql
es responsable de generar una serie de filtros SQL, basados en los parámetros proporcionados. Valida el tipo de filtro, genera sentencias SQL y combina diferentes tipos de filtros como IN
, NOT IN
, rangos, fechas y otros. Si se produce algún error durante el proceso, devuelve un array con los detalles del error.
Signatura
private function genera_filtros_sql(array $columnas_extra, array $diferente_de, array $filtro,
array $filtro_especial, array $filtro_extra, array $filtro_rango, array $in,
array $keys_data_filter, array $not_in, string $sql_extra, string $tipo_filtro,
array $filtro_fecha = array()): array|stdClass
Parámetros
array $columnas_extra
- Tipo:
array
- Descripción: Un array que contiene columnas adicionales que serán utilizadas en la sentencia SQL generada.
array $diferente_de
- Tipo:
array
- Descripción: Un array de condiciones que excluyen valores (
!=
) en la consulta.
array $filtro
- Tipo:
array
- Descripción: Filtros generales que se aplicarán en la consulta SQL.
array $filtro_especial
- Tipo:
array
- Descripción: Un array de condiciones especiales que se aplicarán en la consulta.
array $filtro_extra
- Tipo:
array
- Descripción: Filtros adicionales que pueden agregarse a la consulta SQL.
array $filtro_rango
- Tipo:
array
- Descripción: Un array de rangos de valores que se aplicarán en la consulta SQL.
array $in
- Tipo:
array
- Descripción: Un array de valores que se incluirán en la cláusula
IN
de la consulta SQL.
array $keys_data_filter
- Tipo:
array
- Descripción: Un array de claves que serán utilizadas para aplicar y limpiar los filtros en la consulta.
array $not_in
- Tipo:
array
- Descripción: Un array de valores que se excluirán en la cláusula
NOT IN
de la consulta SQL.
string $sql_extra
- Tipo:
string
- Descripción: Cualquier SQL adicional que se desee agregar a la consulta.
string $tipo_filtro
- Tipo:
string
- Descripción: El tipo de filtro que se aplicará en la consulta. Se valida para asegurar que sea un tipo válido.
array $filtro_fecha
(opcional)
- Tipo:
array
- Descripción: Un array de filtros basados en fechas que se aplicarán en la consulta SQL.
- Valor predeterminado:
[]
(array vacío).
Retorno
array|stdClass
- Tipo:
array
ostdClass
- Descripción:
- Si el proceso es exitoso, devuelve un objeto
stdClass
con los filtros generados y ajustados para la consulta SQL. - Si ocurre un error en cualquier parte del proceso, devuelve un array con un mensaje de error y los detalles.
- Si el proceso es exitoso, devuelve un objeto
Explicación Detallada
-
Validación del tipo de filtro:
- La función comienza validando el tipo de filtro (
$tipo_filtro
) medianteverifica_tipo_filtro
. Si el tipo de filtro no es válido, se devuelve un error.
$verifica_tf = (new \gamboamartin\where\where())->verifica_tipo_filtro(tipo_filtro: $tipo_filtro); if(errores::$error){ return $this->error->error(mensaje: 'Error al validar tipo_filtro', data: $verifica_tf); }
- La función comienza validando el tipo de filtro (
-
Generación de la sentencia SQL base:
- Se genera la sentencia SQL base usando las columnas extra y los filtros proporcionados. Si hay un error, se captura y se devuelve un mensaje de error.
$sentencia = (new \gamboamartin\where\where())->genera_sentencia_base( columnas_extra: $columnas_extra, filtro: $filtro, tipo_filtro: $tipo_filtro); if(errores::$error){ return $this->error->error(mensaje: 'Error al generar sentencia', data: $sentencia); }
-
Generación de los distintos filtros SQL:
- La función genera varios tipos de filtros SQL como
filtro_especial
,filtro_rango
,filtro_extra
,not_in
,in
, yfiltro_fecha
. Si alguno de estos procesos falla, se devuelve un mensaje de error.
$filtro_especial_sql = $this->filtro_especial_sql(columnas_extra: $columnas_extra, filtro_especial: $filtro_especial); if(errores::$error){ return $this->error->error(mensaje: 'Error al generar filtro', data: $filtro_especial_sql); }
$filtro_rango_sql = (new \gamboamartin\where\where())->filtro_rango_sql(filtro_rango: $filtro_rango); if(errores::$error){ return $this->error->error(mensaje: 'Error al generar $filtro_rango_sql', data: $filtro_rango_sql); }
Similarmente para
filtro_extra_sql
,not_in_sql
,in_sql
, yfiltro_fecha_sql
. - La función genera varios tipos de filtros SQL como
-
Generación de los filtros iniciales:
- Se llama a la función
genera_filtros_iniciales
para combinar todos los filtros generados. Si falla, se devuelve un mensaje de error.
$filtros = $this->genera_filtros_iniciales( diferente_de_sql: $diferente_de_sql, filtro_especial_sql: $filtro_especial_sql, filtro_extra_sql: $filtro_extra_sql, filtro_rango_sql: $filtro_rango_sql, in_sql: $in_sql, keys_data_filter: $keys_data_filter, not_in_sql: $not_in_sql, sentencia: $sentencia, sql_extra: $sql_extra, filtro_fecha_sql: $filtro_fecha_sql ); if(errores::$error){ return $this->error->error(mensaje: 'Error al generar filtros', data: $filtros); }
- Se llama a la función
-
Retorno del objeto de filtros:
- Si todo es exitoso, la función devuelve el objeto con los filtros generados.
return $filtros;
Ejemplos
$columnas_extra = ['nombre', 'apellido'];
$diferente_de = ['id != 1'];
$filtro = ['estatus = "activo"'];
$filtro_especial = ['tipo = "admin"'];
$filtro_extra = [];
$filtro_rango = ['fecha BETWEEN "2023-01-01" AND "2023-12-31"'];
$in = ['id IN (1, 2, 3)'];
$keys_data_filter = ['estatus', 'tipo', 'fecha'];
$not_in = ['id NOT IN (4, 5)'];
$sql_extra = 'ORDER BY nombre ASC';
$tipo_filtro = 'AND';
$filtro_fecha = ['fecha >= "2023-01-01"'];
$resultado = $this->genera_filtros_sql(
$columnas_extra, $diferente_de, $filtro, $filtro_especial, $filtro_extra,
$filtro_rango, $in, $keys_data_filter, $not_in, $sql_extra, $tipo_filtro, $filtro_fecha
);
### Código de la Función
```php
private function genera_filtros_sql(array $columnas_extra, array $diferente_de, array $filtro,
array $filtro_especial, array $filtro_extra, array $filtro_rango, array $in,
array $keys_data_filter, array $not_in, string $sql_extra, string $tipo_filtro,
array $filtro_fecha = array()): array|stdClass
{
$verifica_tf = (new \gamboamartin\where\where())->verifica_tipo_filtro(tipo_filtro: $tipo_filtro);
if(errores::$error){
return $this->error->error(mensaje: 'Error al validar tipo_filtro',data: $verifica_tf);
}
$sentencia = (new \gamboamartin\where\where())->genera_sentencia_base(columnas_extra: $columnas_extra,
filtro: $filtro, tipo_filtro: $tipo_filtro);
if(errores::$error){
return $this->error->error(mensaje:'Error al generar sentencia', data:$sentencia);
}
$filtro_especial_sql = $this->filtro_especial_sql(
columnas_extra: $columnas_extra, filtro_especial: $filtro_especial);
if(errores::$error){
return $this->error->error(mensaje:'Error al generar filtro',data: $filtro_especial_sql);
}
$filtro_rango_sql = (new \gamboamartin\where\where())->filtro_rango_sql(filtro_rango: $filtro_rango);
if(errores::$error){
return $this->error->error(mensaje:'Error $filtro_rango_sql al generar',data:$filtro_rango_sql);
}
$filtro_extra_sql = (new \gamboamartin\where\where())->filtro_extra_sql(filtro_extra: $filtro_extra);
if(errores::$error){
return $this->error->error(mensaje:'Error al generar filtro extra',data:$filtro_extra_sql);
}
$not_in_sql = (new \gamboamartin\where\where())->genera_not_in_sql(not_in: $not_in);
if(errores::$error){
return $this->error->error(mensaje:'Error al generar sql',data:$not_in_sql);
}
$in_sql = $this->genera_in_sql_normalizado(in: $in);
if(errores::$error){
return $this->error->error(mensaje:'Error al generar in_sql',data:$in_sql);
}
$filtro_fecha_sql = (new \gamboamartin\where\where())->filtro_fecha(filtro_fecha: $filtro_fecha);
if(errores::$error){
return $this->error->error(mensaje:'Error al generar filtro_fecha',data:$filtro_fecha_sql);
}
$diferente_de_sql = $this->diferente_de_sql(diferente_de: $diferente_de);
if(errores::$error){
return $this->error->error(mensaje:'Error al generar sql',data:$diferente_de_sql);
}
$filtros = $this->genera_filtros_iniciales(diferente_de_sql: $diferente_de_sql,
filtro_especial_sql: $filtro_especial_sql, filtro_extra_sql: $filtro_extra_sql,
filtro_rango_sql: $filtro_rango_sql, in_sql: $in_sql, keys_data_filter: $keys_data_filter,
not_in_sql: $not_in_sql, sentencia: $sentencia, sql_extra: $sql_extra,
filtro_fecha_sql: $filtro_fecha_sql);
if(errores::$error){
return $this->error->error(mensaje:'Error al generar filtros',data:$filtros);
}
return $filtros;
}