src.where.filtro_rango_sql - gamboamartin/where GitHub Wiki

filtro_rango_sql

La función filtro_rango_sql es una función pública que genera una cláusula SQL que combina múltiples condiciones de rango BETWEEN para diferentes campos. Esta función recorre un array de filtros de rango, valida cada entrada, y genera la cláusula SQL correspondiente para cada rango, integrándolos en una única cadena SQL.

Signatura

final public function filtro_rango_sql(array $filtro_rango):array|string

Parámetros

  • array $filtro_rango:
    Un array donde cada clave es un campo de la base de datos y su valor es otro array que contiene los valores valor1 y valor2 para establecer el rango del filtro. Opcionalmente, puede incluir la clave valor_campo que indica si el campo debe tratarse como un valor literal.

Retorna

  • array|string:
    Retorna una cadena que representa la cláusula SQL completa generada a partir de los filtros de rango. En caso de error, retorna un array de error generado por $this->error->error().

Explicación Detallada

  1. Inicialización de la cláusula SQL:

    • La función comienza inicializando $filtro_rango_sql como una cadena vacía. Esta cadena se utilizará para construir la cláusula SQL final.
  2. Iteración sobre los filtros de rango:

    • La función itera sobre cada entrada en el array $filtro_rango. Cada clave representa un campo de la base de datos y el valor asociado es un array que contiene los detalles del rango.
  3. Validación de cada filtro:

    • La función valida que cada filtro sea un array. Si no lo es, se genera un mensaje de error y se retorna un array con el mensaje de error.
    • Verifica que los valores valor1 y valor2 existan en el filtro. Si alguno de estos valores falta, se genera un mensaje de error y se retorna un array con el mensaje de error.
    • Valida que el nombre del campo sea una cadena. Si es numérico, se genera un mensaje de error y se retorna un array con el mensaje de error.
  4. Determinación de la configuración valor_campo:

    • La función determina si se debe tratar el campo como un valor literal (valor_campo) basado en la existencia y valor de la clave valor_campo en el filtro. Por defecto, valor_campo es false.
  5. Generación de la condición SQL BETWEEN:

    • La función llama a genera_filtro_rango_base() para generar la condición BETWEEN para el campo actual, integrando la nueva condición con cualquier condición previa en $filtro_rango_sql.
    • Si ocurre un error durante la generación, se genera un mensaje de error y se retorna un array con el mensaje de error.
  6. Retorno de la cláusula SQL completa:

    • Después de procesar todos los filtros de rango, la función retorna la cadena $filtro_rango_sql que contiene todas las condiciones combinadas.

Ejemplos

$filtro_rango = [
    'fecha' => ['valor1' => '2023-01-01', 'valor2' => '2023-12-31'],
    'precio' => ['valor1' => 100, 'valor2' => 500, 'valor_campo' => true]
];

$resultado = $this->filtro_rango_sql($filtro_rango);

// Resultado esperado:
// "fecha BETWEEN '2023-01-01' AND '2023-12-31' AND 'precio' BETWEEN 100 AND 500"
// Un array de error si ocurre algún problema.

Código de la Función

final public function filtro_rango_sql(array $filtro_rango):array|string
    {
        $filtro_rango_sql = '';
        foreach ($filtro_rango as $campo=>$filtro){
            if(!is_array($filtro)){
                return  $this->error->error(mensaje: 'Error $filtro debe ser un array',data: $filtro, es_final: true);
            }
            if(!isset($filtro['valor1'])){
                return  $this->error->error(mensaje:'Error $filtro[valor1] debe existir',data:$filtro, es_final: true);
            }
            if(!isset($filtro['valor2'])){
                return  $this->error->error(mensaje:'Error $filtro[valor2] debe existir',data:$filtro, es_final: true);
            }
            $campo = trim($campo);
            if(is_numeric($campo)){
                return  $this->error->error(mensaje:'Error campo debe ser un string',data:$campo, es_final: true);
            }
            $valor_campo = false;

            if(isset($filtro['valor_campo']) && $filtro['valor_campo']){
                $valor_campo = true;
            }
            $filtro_rango_sql = $this->genera_filtro_rango_base(campo: $campo,filtro: $filtro,
                filtro_rango_sql: $filtro_rango_sql,valor_campo: $valor_campo);
            if(errores::$error){
                return  $this->error->error(mensaje:'Error $filtro_rango_sql al generar',data:$filtro_rango_sql);
            }
        }

        return $filtro_rango_sql;
    }