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;

    }