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 valoresvalor1
yvalor2
para establecer el rango del filtro. Opcionalmente, puede incluir la clavevalor_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
-
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.
- La función comienza inicializando
-
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.
- La función itera sobre cada entrada en el array
-
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
yvalor2
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.
-
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 clavevalor_campo
en el filtro. Por defecto,valor_campo
esfalse
.
- La función determina si se debe tratar el campo como un valor literal (
-
Generación de la condición SQL
BETWEEN
:- La función llama a
genera_filtro_rango_base()
para generar la condiciónBETWEEN
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.
- La función llama a
-
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.
- Después de procesar todos los filtros de rango, la función retorna la cadena
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;
}