administrador.base.orm.modelo.genera_sql_filtro - gamboamartin/administrador GitHub Wiki

genera_sql_filtro

La función consulta_full_and genera una consulta SQL completa utilizando un objeto stdClass llamado $complemento, una consulta base en forma de cadena, y un objeto modelo. La función primero valida que la consulta base no esté vacía, luego inicializa el complemento con los filtros y parámetros necesarios, y finalmente construye la consulta SQL completa. Si ocurre algún error en cualquier parte del proceso, devuelve un array con los detalles del error.

Signatura

private function genera_sql_filtro(array $columnas, array $columnas_by_table, bool $columnas_en_bruto, bool $con_sq,
                                       array $diferente_de, array $extra_join, array $filtro, array $filtro_especial,
                                       array $filtro_extra, array $filtro_rango, array $group_by, array $in, int $limit,
                                       array $not_in, int $offset, array $order, string $sql_extra, string $tipo_filtro,
                                       bool $count = false, array $filtro_fecha = array()): array|string

Parámetros

array $columnas

  • Tipo: array
  • Descripción: Un array de columnas que serán seleccionadas en la consulta SQL.

array $columnas_by_table

  • Tipo: array
  • Descripción: Un array que define las columnas organizadas por tabla, útil para identificar la tabla de origen de cada columna.

bool $columnas_en_bruto

  • Tipo: bool
  • Descripción: Indica si las columnas deben ser tratadas de forma directa (en bruto) sin aplicar transformaciones.

bool $con_sq

  • Tipo: bool
  • Descripción: Define si se debe incluir subconsultas (subqueries) en la consulta generada.

array $diferente_de

  • Tipo: array
  • Descripción: Condiciones != que se aplicarán a las columnas en la consulta SQL.

array $extra_join

  • Tipo: array
  • Descripción: Define las cláusulas JOIN adicionales que se incluirán en la consulta.

array $filtro

  • Tipo: array
  • Descripción: Un array de filtros generales que se aplicarán en la cláusula WHERE.

array $filtro_especial

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

array $filtro_extra

  • Tipo: array
  • Descripción: Filtros adicionales que se aplicarán a la consulta.

array $filtro_rango

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

array $group_by

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

array $in

  • Tipo: `array**
  • Descripción: Condiciones IN que se aplicarán a las columnas en la consulta SQL.

int $limit

  • Tipo: int
  • Descripción: El límite de filas que se deben devolver. Debe ser mayor o igual a cero.

array $not_in

  • Tipo: array
  • Descripción: Condiciones NOT IN que se aplicarán a las columnas en la consulta SQL.

int $offset

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

array $order

  • Tipo: array
  • Descripción: Las columnas que se utilizarán en la cláusula ORDER BY.

string $sql_extra

  • Tipo: string
  • Descripción: SQL adicional que puede agregarse a la consulta.

string $tipo_filtro

  • Tipo: string
  • Descripción: El tipo de filtro que se utilizará (AND o OR).

bool $count (opcional)

  • Tipo: bool
  • Descripción: Define si la consulta debe contar el número de filas en lugar de devolverlas.
  • Valor predeterminado: false.

array $filtro_fecha (opcional)

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

Retorno

array|string

  • Tipo: array o string
  • Descripción:
    • Si la operación es exitosa, devuelve la consulta SQL generada como una cadena.
    • Si ocurre algún error en el proceso, devuelve un array con un mensaje de error y los detalles correspondientes.

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: $limit, es_final: true);
    }
    if ($offset < 0) {
        return $this->error->error(mensaje: 'Error $offset debe ser mayor o igual a 0', data: $offset, es_final: true);
    }
    
  2. Validación del tipo de filtro:

    • La función valida que el tipo de filtro ($tipo_filtro) sea válido llamando a verifica_tipo_filtro. Si no es válido, se captura y 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);
    }
    
  3. Generación de la consulta base:

    • A continuación, se genera la consulta base utilizando la función genera_consulta_base, que selecciona las columnas y las tablas necesarias. Si ocurre un error, se captura y se devuelve un mensaje de error.
    $consulta = $this->genera_consulta_base(columnas: $columnas, columnas_by_table: $columnas_by_table,
        columnas_en_bruto: $columnas_en_bruto, con_sq: $con_sq, count: $count, extension_estructura: $this->extension_estructura, extra_join: $extra_join, renombradas: $this->renombres);
    if (errores::$error) {
        return $this->error->error(mensaje: 'Error al generar sql', data: $consulta);
    }
    
  4. Procesamiento de la cláusula IN:

    • Luego, la función procesa la cláusula IN utilizando in_llave. Si ocurre un error, se captura y se devuelve un mensaje de error.
    $in = $this->in_llave(in: $in);
    if (errores::$error) {
        return $this->error->error(mensaje: 'Error al integrar in', data: $in);
    }
    
  5. Generación del complemento SQL:

    • A continuación, se genera el complemento SQL (filtros, rangos, etc.) mediante la función complemento_sql. Si ocurre un error, se devuelve un array de error.
    $complemento_sql = (new filtros())->complemento_sql(aplica_seguridad: false, diferente_de: $diferente_de,
        filtro: $filtro, filtro_especial: $filtro_especial, filtro_extra: $filtro_extra,
        filtro_rango: $filtro_rango, group_by: $group_by, in: $in, limit: $limit, modelo: $this, not_in: $not_in,
        offset: $offset, order: $order, sql_extra: $sql_extra, tipo_filtro: $tipo_filtro, filtro_fecha: $filtro_fecha);
    if (errores::$error) {
        return $this->error->error(mensaje: 'Error al maquetar sql', data: $complemento_sql);
    }
    
  6. Generación de la consulta SQL completa:

    • Finalmente, se genera la consulta SQL completa llamando a consulta_full_and. Si ocurre un error, se devuelve un array de error.
    $sql = (new filtros())->consulta_full_and(complemento: $complemento_sql, consulta: $consulta, modelo: $this);
    if (errores::$error) {
        return $this->error->error(mensaje: 'Error al maquetar sql', data: $sql);
    }
    
  7. Retorno de la consulta SQL:

    • La consulta SQL generada se almacena en la propiedad consulta del modelo y se devuelve.
    $this->consulta = $sql;
    return $sql;
    

Ejemplo de uso

$columnas = ['id', 'nombre'];
$columnas_by_table = ['tabla1' => ['id', 'nombre']];
$limit = 10;
$offset = 0;
$in = ['id IN (1, 2, 3)'];
$not_in = ['id NOT IN (4, 5)'];
$order = ['nombre ASC'];
$tipo_filtro = 'AND';

$sql = $this->genera_sql_filtro(
    columnas: $columnas,
    columnas_by_table: $columnas_by_table,
    columnas_en_bruto: false,
    con_sq: false,
    diferente_de: [],
    extra_join: [],
    filtro: [],
    filtro_especial: [],
    filtro_extra: [],
    filtro_rango: [],
    group_by: [],
    in: $in,
    limit: $limit,
    not_in: $not_in,
    offset: $offset,
    order: $order,
    sql_extra: '',
    tipo_filtro: $tipo_filtro
);

// Resultado esperado:
// Una consulta SQL generada que incluye los filtros, limitaciones y órdenes especificados.

Código de la Función

private function genera_sql_filtro(array $columnas, array $columnas_by_table, bool $columnas_en_bruto, bool $con_sq,
                                       array $diferente_de, array $extra_join, array $filtro, array $filtro_especial,
                                       array $filtro_extra, array $filtro_rango, array $group_by, array $in, int $limit,
                                       array $not_in, int $offset, array $order, string $sql_extra, string $tipo_filtro,
                                       bool $count = false, array $filtro_fecha = array()): array|string
    {


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

        $consulta = $this->genera_consulta_base(columnas: $columnas, columnas_by_table: $columnas_by_table,
            columnas_en_bruto: $columnas_en_bruto, con_sq: $con_sq, count: $count,
            extension_estructura: $this->extension_estructura, extra_join: $extra_join, renombradas: $this->renombres);
        if(errores::$error){
            return $this->error->error(mensaje: 'Error al generar sql',data: $consulta);
        }


        $in = $this->in_llave(in: $in);
        if(errores::$error){
            return  $this->error->error(mensaje: 'Error al integrar in',data: $in);
        }

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

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

        $sql = (new filtros())->consulta_full_and(complemento:  $complemento_sql, consulta: $consulta, modelo: $this);
        if(errores::$error){
            return  $this->error->error(mensaje:'Error al maquetar sql',data: $sql);
        }

        $this->consulta = $sql;

        return $sql;
    }