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 o stdClass
  • 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.

Explicación Detallada

  1. Validación del tipo de filtro:

    • La función comienza validando el tipo de filtro ($tipo_filtro) mediante verifica_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);
    }
    
  2. 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);
    }
    
  3. 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, y filtro_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, y filtro_fecha_sql.

  4. 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);
    }
    
  5. 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;

    }