src.where.genera_and - gamboamartin/where GitHub Wiki
genera_and
La función genera_and construye una sentencia SQL dinámica basada en los filtros proporcionados. 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
public function genera_and(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_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.
-
Validación del operador lógico:
-
- Se obtiene el operador lógico (AND u OR) del dato o se establece como AND por defecto.
-
- Si el operador no es AND ni OR, se devuelve un array indicando que el operador debe ser AND u OR.
-
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($columnas_extra, $filtro);
// Retorno esperado: "tabla1.campo1 = 'valor1' AND tabla2.campo2 = 'valor2'"
Código de la Función
final public function genera_and(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 campo",data:$data_comparacion);
}
$comparacion = $this->comparacion(data: $data,default: '=');
if(errores::$error){
return $this->error->error(mensaje:"Error al maquetar",data:$comparacion);
}
$operador = $data['operador'] ?? ' AND ';
if(trim($operador) !=='AND' && trim($operador) !=='OR'){
return $this->error->error(mensaje:'El operador debe ser AND u OR',data:$operador, es_final: true);
}
$data_sql = "$data_comparacion->campo $comparacion '$data_comparacion->value'";
$sentencia .= $sentencia === ''? $data_sql :" $operador $data_sql";
}
return $sentencia;
}