src.where.genera_and_textos - gamboamartin/where GitHub Wiki
genera_and_textos
La función genera_and_textos construye una sentencia SQL dinámica basada en los filtros proporcionados, específicamente para comparaciones de texto utilizando el operador LIKE. Esta función se asegura de que los filtros sean válidos y de que los operadores lógicos sean correctos (AND u OR).
Signatura
private function genera_and_textos(array $columnas_extra, array $filtro): array|string
Parámetros
$columnas_extra (array): Un array que contiene columnas adicionales que pueden ser utilizadas en la comparación.
$filtro (array): Un array asociativo donde las claves son los nombres de las columnas y los valores son los datos de filtro y operadores.
Retorna
- string|array: que representa la sentencia SQL construida a partir de los filtros. En caso de error, devuelve un array con detalles del error.
Explicación Detallada
-
Inicialización:
-
- Se inicializa la variable $sentencia como una cadena vacía.
-
Iteración sobre los filtros:
-
- Se itera sobre cada clave y valor en el array filtro.
-
Validación de la clave:
-
- Si la clave es numérica, se devuelve un error indicando que las claves deben ser campos asociativos con referencia a tabla.campo.
-
Comparación pura:
-
- Se llama a la función comparacion_pura para obtener la comparación pura del dato.
-
- Si ocurre un error, se devuelve un array indicando que hubo un problema al maquetar el campo.
-
Comparación:
-
- Se llama a la función comparacion para obtener el operador de comparación (LIKE por defecto).
-
- Si ocurre un error, se devuelve un array indicando que hubo un problema al maquetar la comparación.
-
Construcción del operador lógico:
-
- Se establece el operador lógico (AND por defecto).
-
- Si el operador está definido en los datos y no está vacío, se actualiza el operador y se establece el texto de comparación ($txt) como una cadena vacía.
-
Construcción de la sentencia SQL:
-
- Se construye la parte SQL de la condición.
-
- Se concatena a la sentencia existente utilizando el operador lógico correspondiente.
-
Retorno de la sentencia:
-
- Se retorna la sentencia SQL construida.
Ejemplos
$columnas_extra = ['tabla1.campo1', 'tabla2.campo2'];
$filtro = [
'tabla1.campo1' => ['value' => 'valor1', 'operador' => 'AND'],
'tabla2.campo2' => ['value' => 'valor2', 'operador' => 'OR']
];
$sentencia = genera_and_textos($columnas_extra, $filtro);
// Retorno esperado: "tabla1.campo1 LIKE '%valor1%' AND tabla2.campo2 LIKE '%valor2%'"
Código de la Función
private function genera_and_textos(array $columnas_extra, array $filtro):array|string{
$sentencia = '';
foreach ($filtro as $key => $data) {
if(is_numeric($key)){
return $this->error->error(
mensaje: 'Los key deben de ser campos asociativos con referencia a tabla.campo',data: $filtro,
es_final: true);
}
$data_comparacion = $this->comparacion_pura(columnas_extra: $columnas_extra, data: $data,key: $key);
if(errores::$error){
return $this->error->error(mensaje: "Error al maquetar",data:$data_comparacion);
}
$comparacion = $this->comparacion(data: $data,default: 'LIKE');
if(errores::$error){
return $this->error->error(mensaje:"Error al maquetar",data:$comparacion);
}
$txt = '%';
$operador = 'AND';
if(isset($data['operador']) && $data['operador']!==''){
$operador = $data['operador'];
$txt= '';
}
$sentencia .= $sentencia === ""?"$data_comparacion->campo $comparacion '$txt$data_comparacion->value$txt'":
" $operador $data_comparacion->campo $comparacion '$txt$data_comparacion->value$txt'";
}
return $sentencia;
}