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;

    }