src.where.datos_filtro_especial - gamboamartin/where GitHub Wiki

datos_filtro_especial

La función datos_filtro_especial es una función privada que extrae y valida los datos necesarios para construir una condición SQL basada en un filtro especial. La función verifica que los elementos esenciales estén presentes en el array de entrada y luego construye una estructura stdClass que contiene la información necesaria para generar una cláusula SQL.

Signatura

private function datos_filtro_especial(array $data_filtro):array|stdClass

Parámetros

  • array $data_filtro:
    Un array asociativo que contiene los datos del filtro especial. Este array debe incluir las claves operador, valor y comparacion, asociadas al campo que se va a utilizar en la condición SQL.

Retorna

  • array|stdClass:
    Retorna un objeto stdClass que contiene los detalles del filtro especial, incluyendo el campo, el operador, el valor, la comparación y la condición SQL generada. En caso de error, retorna un array de error generado por $this->error->error().

Explicación Detallada

  1. Verificación de que el array no esté vacío:

    • La función verifica si el array $data_filtro tiene al menos un elemento. Si está vacío, genera un mensaje de error y retorna un array con el mensaje de error.
  2. Extracción y validación de la clave del campo:

    • La función llama a campo_data_filtro() para extraer y validar la clave del campo del array $data_filtro.
    • Si ocurre un error durante esta extracción, se genera un mensaje de error y se retorna un array con el mensaje de error.
  3. Validación de la existencia del operador:

    • La función verifica que el campo extraído contenga una clave operador. Si no existe, se genera un mensaje de error y se retorna un array con el mensaje de error.
    • Si el operador está presente pero es una cadena vacía, se genera un mensaje de error y se retorna un array con el mensaje de error.
  4. Validación de la existencia del valor y la comparación:

    • La función verifica que el campo extraído contenga las claves valor y comparacion. Si alguna de estas claves falta, se genera un mensaje de error y se retorna un array con el mensaje de error.
    • Si el valor está presente pero es una cadena vacía, se genera un mensaje de error y se retorna un array con el mensaje de error.
  5. Construcción de la condición SQL:

    • La función genera la condición SQL utilizando el campo, el operador y el valor, escapando los caracteres especiales del valor con addslashes() para prevenir inyecciones SQL.
  6. Retorno del objeto stdClass:

    • La función retorna un objeto stdClass que contiene los siguientes atributos:
      • campo: El nombre del campo.
      • operador: El operador SQL a utilizar (por ejemplo, =, LIKE).
      • valor: El valor a comparar.
      • comparacion: El tipo de comparación a realizar.
      • condicion: La condición SQL completa generada.

Ejemplos

$data_filtro = [
    'precio' => [
        'operador' => '=',
        'valor' => '100',
        'comparacion' => 'AND'
    ]
];

$resultado = $this->datos_filtro_especial($data_filtro);

// Resultado esperado:
// Un objeto stdClass con los atributos:
// - campo: "precio"
// - operador: "="
// - valor: "100"
// - comparacion: "AND"
// - condicion: "precio='100'"
// Un array de error si ocurre algún problema.

Código de la Función

private function datos_filtro_especial(array $data_filtro):array|stdClass
    {
        if(count($data_filtro) === 0){
            return $this->error->error(mensaje:'Error data_filtro esta vacio',  data:$data_filtro, es_final: true);
        }
        $campo = $this->campo_data_filtro(data_filtro: $data_filtro);
        if(errores::$error){
            return $this->error->error(mensaje:'Error al obtener campo',data:  $campo);
        }

        if(!isset($data_filtro[$campo]['operador'])){
            return $this->error->error(mensaje:'Error data_filtro['.$campo.'][operador] debe existir',
                data:$data_filtro, es_final: true);
        }

        $operador = $data_filtro[$campo]['operador'];
        if($operador===''){
            return $this->error->error(mensaje:'Error el operador debe de existir',data:$operador, es_final: true);
        }

        if(!isset($data_filtro[$campo]['valor'])){
            return $this->error->error(mensaje:'Error data_filtro['.$campo.'][valor] debe existir',
                data:$data_filtro, es_final: true);
        }
        if(!isset($data_filtro[$campo]['comparacion'])){
            return $this->error->error(mensaje:'Error data_filtro['.$campo.'][comparacion] debe existir',
                data:$data_filtro, es_final: true);
        }

        $valor = $data_filtro[$campo]['valor'];
        if($valor===''){
            return $this->error->error(mensaje:'Error el operador debe de existir',data:$valor, es_final: true);
        }
        $valor = addslashes($valor);
        $comparacion = $data_filtro[$campo]['comparacion'];
        $condicion = $campo.$operador."'$valor'";

        $datos = new stdClass();
        $datos->campo = $campo;
        $datos->operador = $operador;
        $datos->valor = $valor;
        $datos->comparacion = $comparacion;
        $datos->condicion = $condicion;

        return $datos;

    }