administrador.base.orm.where.data_filtros_full - gamboamartin/administrador GitHub Wiki

data_filtros_full

La función data_filtros_full genera un conjunto completo de filtros SQL a partir de los parámetros proporcionados, validando el tipo de filtro, construyendo filtros complejos y generando una cláusula WHERE en base a los filtros definidos. La función también ajusta los filtros envolviéndolos en paréntesis y concatenando las condiciones con AND cuando sea necesario. Si se produce algún error durante el proceso, devuelve un array con los detalles del error.

Signatura

final public function data_filtros_full(array $columnas_extra, array $diferente_de, array $filtro,
                                      array $filtro_especial, array $filtro_extra, array $filtro_fecha,
                                      array $filtro_rango, array $in, array $keys_data_filter, array $not_in,
                                      string $sql_extra, string $tipo_filtro): array|stdClass

Parámetros

array $columnas_extra

  • Tipo: array
  • Descripción: Un array que contiene columnas adicionales que serán utilizadas en la generación de la consulta SQL.

array $diferente_de

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

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 se aplicarán en la consulta SQL.

array $filtro_fecha

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

array $filtro_rango

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

array $in

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

array $keys_data_filter

  • Tipo: array
  • Descripción: Un array de claves que representan los nombres de los filtros que serán utilizados para generar y ajustar las condiciones de la consulta.

array $not_in

  • Tipo: array
  • Descripción: Un array de valores que serán utilizados en una cláusula NOT IN en 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 será validado y aplicado en la consulta. Se utiliza para definir la lógica de concatenación (por ejemplo, AND o OR).

Retorno

array|stdClass

  • Tipo: array o stdClass
  • Descripción:
    • Si la operación es exitosa, devuelve un objeto stdClass con los filtros generados y ajustados para la consulta SQL, incluyendo una cláusula WHERE cuando sea necesario.
    • Si ocurre un error en alguna parte del proceso, devuelve un array con un mensaje de error y los detalles correspondientes.

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 los filtros SQL:

    • Se llama a la función genera_filtros_sql para generar una serie de filtros SQL a partir de los parámetros proporcionados. Si ocurre un error en este paso, se devuelve un array con el mensaje de error.
    $filtros = $this->genera_filtros_sql(columnas_extra: $columnas_extra, diferente_de: $diferente_de,
        filtro: $filtro, filtro_especial: $filtro_especial, filtro_extra: $filtro_extra,
        filtro_rango: $filtro_rango, in: $in, keys_data_filter: $keys_data_filter, not_in: $not_in,
        sql_extra: $sql_extra, tipo_filtro: $tipo_filtro, filtro_fecha: $filtro_fecha);
    if (errores::$error) {
        return $this->error->error(mensaje: 'Error al generar filtros', data: $filtros);
    }
    
  3. Generación de la cláusula WHERE:

    • Se llama a la función where para generar la cláusula WHERE en base a los filtros proporcionados. Si no hay filtros con contenido, la cláusula WHERE no se generará. Si ocurre un error, se devuelve un mensaje de error.
    $where = $this->where(filtros: $filtros, keys_data_filter: $keys_data_filter);
    if (errores::$error) {
        return $this->error->error(mensaje: 'Error al generar where', data: $where);
    }
    
  4. Ajuste y formato de los filtros:

    • La función ajusta los filtros aplicando el formato correspondiente (envolviendo los valores en paréntesis y concatenando con AND si es necesario). Si ocurre un error durante este paso, se devuelve un mensaje de error.
    $filtros = $this->filtros_full(filtros: $filtros, keys_data_filter: $keys_data_filter);
    if (errores::$error) {
        return $this->error->error(mensaje: 'Error al generar filtros', data: $filtros);
    }
    
  5. Asignación de la cláusula WHERE al objeto de filtros:

    • Una vez que los filtros han sido ajustados, la cláusula WHERE generada se asigna al objeto $filtros.
    $filtros->where = $where;
    return $filtros;
    

Ejemplo de uso

$columnas_extra = ['nombre', 'apellido'];
$diferente_de = ['id != 1'];
$filtro = ['estatus = "activo"'];
$filtro_especial = ['tipo = "admin"'];
$filtro_extra = [];
$filtro_fecha = ['fecha >= "2023-01-01"'];
$filtro_rango = ['rango BETWEEN "1000" AND "5000"'];
$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';

$resultado = $this->data_filtros_full(
    $columnas_extra, $diferente_de, $filtro, $filtro_especial, $filtro_extra, $filtro_fecha,
    $filtro_rango, $in, $keys_data_filter, $not_in, $sql_extra, $tipo_filtro
);

Código de la Función

final public function data_filtros_full(array $columnas_extra, array $diferente_de, array $filtro,
                                      array $filtro_especial, array $filtro_extra, array $filtro_fecha,
                                      array $filtro_rango, array $in, array $keys_data_filter, array $not_in,
                                      string $sql_extra, string $tipo_filtro): 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);
        }
        $filtros = $this->genera_filtros_sql(columnas_extra: $columnas_extra, diferente_de: $diferente_de,
            filtro:  $filtro, filtro_especial:  $filtro_especial, filtro_extra:  $filtro_extra,
            filtro_rango:  $filtro_rango, in: $in, keys_data_filter: $keys_data_filter, not_in: $not_in,
            sql_extra: $sql_extra, tipo_filtro: $tipo_filtro, filtro_fecha: $filtro_fecha);
        if(errores::$error){
            return $this->error->error(mensaje:'Error al generar filtros', data:$filtros);
        }

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

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