administrador.base.orm.filtros.complemento_sql - gamboamartin/administrador GitHub Wiki

complemento_sql

La función complemento_sql genera una estructura SQL completa, que incluye filtros y parámetros adicionales como LIMIT, OFFSET, GROUP BY, y ORDER, además de manejar cláusulas especiales como IN, NOT IN, y filtros basados en fechas o rangos. Valida que los parámetros clave como LIMIT y OFFSET sean mayores o iguales a cero y ajusta los filtros antes de generar el SQL final. Si ocurre algún error en el proceso, devuelve un array con los detalles del error.

Signatura

final public function complemento_sql(bool $aplica_seguridad, array $diferente_de, array $filtro,
                                          array $filtro_especial, array $filtro_extra, array $filtro_rango,
                                          array $group_by, array $in, int $limit, modelo $modelo, array $not_in,
                                          int $offset, array $order, string $sql_extra, string $tipo_filtro,
                                          array $filtro_fecha = array()): array|stdClass

Parámetros

bool $aplica_seguridad

  • Tipo: bool
  • Descripción: Define si se debe aplicar seguridad en la generación de la consulta SQL.

array $diferente_de

  • Tipo: array
  • Descripción: Un array de condiciones que excluyen ciertos valores (!=) en la consulta.

array $filtro

  • Tipo: array
  • Descripción: Un array de filtros generales que serán utilizados en la consulta SQL.

array $filtro_especial

  • Tipo: array
  • Descripción: Un array de condiciones especiales que se aplicarán a la consulta.

array $filtro_extra

  • Tipo: array
  • Descripción: Filtros adicionales que serán utilizados en la consulta SQL.

array $filtro_rango

  • Tipo: array
  • Descripción: Un array de rangos que se aplicarán en la consulta SQL.

array $group_by

  • Tipo: array
  • Descripción: Un array de columnas que serán utilizadas en la cláusula GROUP BY.

array $in

  • Tipo: array
  • Descripción: Un array de valores que serán utilizados en la cláusula IN de la consulta SQL.

int $limit

  • Tipo: int
  • Descripción: El límite de resultados que debe aplicarse a la consulta. Debe ser mayor o igual a cero.

modelo $modelo

  • Tipo: modelo
  • Descripción: Un objeto de tipo modelo que contiene columnas y filtros predefinidos para la consulta.

array $not_in

  • Tipo: array
  • Descripción: Un array de valores que serán excluidos mediante la cláusula NOT IN en la consulta SQL.

int $offset

  • Tipo: int
  • Descripción: El desplazamiento de resultados (paginación) para la consulta. Debe ser mayor o igual a cero.

array $order

  • Tipo: array
  • Descripción: Un array de columnas que serán utilizadas en la cláusula ORDER BY de la consulta.

string $sql_extra

  • Tipo: string
  • Descripción: SQL adicional que puede agregarse a la consulta, como cláusulas extra o condiciones adicionales.

string $tipo_filtro

  • Tipo: string
  • Descripción: Define el tipo de filtro que se aplicará, por ejemplo, AND o OR. Este parámetro es validado para asegurar que sea un valor permitido.

array $filtro_fecha (opcional)

  • Tipo: array
  • Descripción: Filtros basados en fechas que se aplicarán a la consulta SQL.
  • Valor predeterminado: [] (array vacío).

Retorno

array|stdClass

  • Tipo: array o stdClass
  • Descripción:
    • Si la operación es exitosa, devuelve un objeto stdClass que contiene los filtros generados, los parámetros SQL, y cualquier ajuste necesario en los filtros.
    • Si ocurre un error, devuelve un array con un mensaje de error y los detalles del problema.

Explicación Detallada

  1. Validación de LIMIT y OFFSET:

    • La función comienza validando que los valores de LIMIT y OFFSET sean mayores o iguales a cero. Si alguno de estos valores es negativo, se devuelve un error.
    if ($limit < 0) {
        return $this->error->error(mensaje: 'Error limit debe ser mayor o igual a 0', data: $params_fn, es_final: true);
    }
    if ($offset < 0) {
        return $this->error->error(mensaje: 'Error $offset debe ser mayor o igual a 0', data: $params_fn, es_final: true);
    }
    
  2. Validación del tipo de filtro:

    • La función llama a verifica_tipo_filtro para asegurarse de que el tipo de filtro ($tipo_filtro) sea válido. Si no lo es, se captura el 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);
    }
    
  3. Generación de parámetros SQL:

    • La función utiliza params_sql para generar los parámetros SQL necesarios como LIMIT, OFFSET, GROUP BY, y ORDER BY. Si ocurre un error en este proceso, se devuelve un mensaje de error.
    $params = (new params_sql())->params_sql(aplica_seguridad: $aplica_seguridad, group_by: $group_by,
        limit: $limit, modelo_columnas_extra: $modelo->columnas_extra, offset: $offset, order: $order,
        sql_where_previo: $sql_extra);
    if (errores::$error) {
        return $this->error->error(mensaje: 'Error al generar parametros sql', data: $params);
    }
    
  4. Generación de filtros completos:

    • Se llama a la función data_filtros_full para generar los filtros completos y ajustados a partir de los parámetros proporcionados. Si ocurre un error durante este paso, se captura y se devuelve un mensaje de error.
    $filtros = (new where())->data_filtros_full(columnas_extra: $modelo->columnas_extra, diferente_de: $diferente_de,
        filtro: $filtro, filtro_especial: $filtro_especial, filtro_extra: $filtro_extra, filtro_fecha: $filtro_fecha,
        filtro_rango: $filtro_rango, in: $in, keys_data_filter: $modelo->keys_data_filter, not_in: $not_in,
        sql_extra: $sql_extra, tipo_filtro: $tipo_filtro);
    if (errores::$error) {
        return $this->error->error(mensaje: 'Error al generar filtros', data: $filtros);
    }
    
  5. Ajuste de la cláusula IN:

    • Una vez generados los filtros, la función ajusta la cláusula IN para eliminar espacios innecesarios y asegurar un formato correcto.
    if (!isset($filtros->in)) {
        $filtros->in = '';
    }
    $filtros->in = str_replace('( (', '((', $filtros->in);
    $filtros->in = str_replace('  ', ' ', $filtros->in);
    $filtros->in = trim($filtros->in);
    
  6. Retorno del objeto de filtros:

    • Finalmente, la función asigna los parámetros generados al objeto $filtros y devuelve el resultado.
    $filtros->params = $params;
    return $filtros;
    

Ejemplo de uso

$aplica_seguridad = true;
$diferente_de = ['id != 1'];
$filtro = ['estatus = "activo"'];
$filtro_especial = [];
$filtro_extra = [];
$filtro_rango = [];
$group_by = ['nombre'];
$in = ['id IN (1, 2, 3)'];
$limit = 10;
$modelo = new modelo();
$not_in = ['id NOT IN (4, 5)'];
$offset = 0;
$order = ['nombre ASC'];
$sql_extra = 'ORDER BY nombre ASC';
$tipo_filtro = 'AND';
$filtro_fecha = [];

$resultado = $this->complemento_sql($aplica_seguridad, $diferente_de, $filtro, $filtro_especial, $filtro_extra,
    $filtro_rango, $group_by, $in, $limit, $modelo, $not_in, $offset, $order, $sql_extra, $tipo_filtro, $filtro_fecha);

Código de la Función

final public function complemento_sql(bool $aplica_seguridad, array $diferente_de, array $filtro,
                                          array $filtro_especial, array $filtro_extra, array $filtro_rango,
                                          array $group_by, array $in, int $limit, modelo $modelo, array $not_in,
                                          int $offset, array $order, string $sql_extra, string $tipo_filtro,
                                          array $filtro_fecha = array()): array|stdClass
    {

        $params_fn = new stdClass();
        $params_fn->aplica_seguridad = $aplica_seguridad;
        $params_fn->diferente_de = $diferente_de;
        $params_fn->filtro = $filtro;
        $params_fn->filtro_especial = $filtro_especial;
        $params_fn->filtro_extra = $filtro_extra;
        $params_fn->filtro_fecha = $filtro_fecha;
        $params_fn->filtro_rango = $filtro_rango;
        $params_fn->group_by = $group_by;
        $params_fn->in = $in;
        $params_fn->limit = $limit;
        $params_fn->modelo = $modelo;
        $params_fn->not_in = $not_in;
        $params_fn->offset = $offset;
        $params_fn->order = $order;
        $params_fn->sql_extra = $sql_extra;
        $params_fn->tipo_filtro = $tipo_filtro;

        if($limit<0){
            return $this->error->error(mensaje: 'Error limit debe ser mayor o igual a 0',data:  $params_fn,
                es_final: true);
        }
        if($offset<0){
            return $this->error->error(mensaje: 'Error $offset debe ser mayor o igual a 0',data: $params_fn,
                es_final: true);

        }
        $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);
        }

        $params = (new params_sql())->params_sql(aplica_seguridad: $aplica_seguridad, group_by: $group_by,
            limit:  $limit,modelo_columnas_extra: $modelo->columnas_extra,offset:  $offset,
            order:  $order,sql_where_previo: $sql_extra);
        if(errores::$error){
            return $this->error->error(mensaje: 'Error al generar parametros sql',data:$params);
        }


        $filtros = (new where())->data_filtros_full(columnas_extra: $modelo->columnas_extra,
            diferente_de: $diferente_de, filtro: $filtro, filtro_especial:  $filtro_especial,
            filtro_extra:  $filtro_extra, filtro_fecha:  $filtro_fecha, filtro_rango:  $filtro_rango, in: $in,
            keys_data_filter: $modelo->keys_data_filter, not_in: $not_in, sql_extra: $sql_extra,
            tipo_filtro: $tipo_filtro);

        if(errores::$error){
            return $this->error->error(mensaje: 'Error al generar filtros',data:$filtros);
        }

        if(!isset($filtros->in)){
            $filtros->in = '';
        }

        $filtros->in = str_replace('( (', '((', $filtros->in);
        $filtros->in = str_replace('  ', ' ', $filtros->in);
        $filtros->in = str_replace('  ', ' ', $filtros->in);
        $filtros->in = str_replace('  ', ' ', $filtros->in);
        $filtros->in = str_replace('  ', ' ', $filtros->in);
        $filtros->in = str_replace('( (', '((', $filtros->in);
        $filtros->in = trim($filtros->in);



        $filtros->params = $params;
        return $filtros;
    }